ฉันมีปัญหาคล้ายกันในการแก้ปัญหาดังนั้นฉันจึงเจอคำถามนี้ ฉันทำการเปรียบเทียบประสิทธิภาพของคำตอบของ Andrew Clark และ narayan ซึ่งฉันต้องการแบ่งปัน
ความแตกต่างหลักระหว่างสองคำตอบคือวิธีที่พวกเขาทำซ้ำในรายการภายใน หนึ่งในนั้นใช้แผนที่ builtin ในขณะที่อื่น ๆ ใช้ list comprehension ฟังก์ชั่นแผนที่มีความได้เปรียบเล็กน้อยเพื่อประสิทธิภาพการทำงานที่เข้าใจรายการเทียบเท่าถ้ามันไม่จำเป็นต้อง lambdas ดังนั้นในบริบทของคำถามนี้map
ควรทำงานได้ดีกว่าความเข้าใจในรายการเล็กน้อย
ให้ทำเกณฑ์ประสิทธิภาพเพื่อดูว่าจริงหรือไม่ ฉันใช้ python เวอร์ชั่น 3.5.0 เพื่อทำการทดสอบทั้งหมดนี้ ในชุดทดสอบครั้งแรกฉันต้องการเก็บองค์ประกอบต่อรายการเป็น10และเปลี่ยนจำนวนรายการจาก10-100,000
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*10]"
>>> 100000 loops, best of 3: 15.2 usec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*10]"
>>> 10000 loops, best of 3: 19.6 usec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*100]"
>>> 100000 loops, best of 3: 15.2 usec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*100]"
>>> 10000 loops, best of 3: 19.6 usec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*1000]"
>>> 1000 loops, best of 3: 1.43 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*1000]"
>>> 100 loops, best of 3: 1.91 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*10000]"
>>> 100 loops, best of 3: 13.6 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*10000]"
>>> 10 loops, best of 3: 19.1 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,10))]*100000]"
>>> 10 loops, best of 3: 164 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,10))]*100000]"
>>> 10 loops, best of 3: 216 msec per loop
ในชุดต่อไปของการทดสอบผมอยากจะเพิ่มจำนวนขององค์ประกอบต่อรายการเพื่อ100
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*10]"
>>> 10000 loops, best of 3: 110 usec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*10]"
>>> 10000 loops, best of 3: 151 usec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*100]"
>>> 1000 loops, best of 3: 1.11 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*100]"
>>> 1000 loops, best of 3: 1.5 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*1000]"
>>> 100 loops, best of 3: 11.2 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*1000]"
>>> 100 loops, best of 3: 16.7 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*10000]"
>>> 10 loops, best of 3: 134 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*10000]"
>>> 10 loops, best of 3: 171 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,100))]*100000]"
>>> 10 loops, best of 3: 1.32 sec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,100))]*100000]"
>>> 10 loops, best of 3: 1.7 sec per loop
ให้ใช้ขั้นตอนที่กล้าหาญและแก้ไขจำนวนองค์ประกอบในรายการเป็น1,000
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*10]"
>>> 1000 loops, best of 3: 800 usec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*10]"
>>> 1000 loops, best of 3: 1.16 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*100]"
>>> 100 loops, best of 3: 8.26 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*100]"
>>> 100 loops, best of 3: 11.7 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*1000]"
>>> 10 loops, best of 3: 83.8 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*1000]"
>>> 10 loops, best of 3: 118 msec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*10000]"
>>> 10 loops, best of 3: 868 msec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*10000]"
>>> 10 loops, best of 3: 1.23 sec per loop
>>> python -m timeit "[list(map(float,k)) for k in [list(range(0,1000))]*100000]"
>>> 10 loops, best of 3: 9.2 sec per loop
>>> python -m timeit "[[float(y) for y in x] for x in [list(range(0,1000))]*100000]"
>>> 10 loops, best of 3: 12.7 sec per loop
จากการทดสอบเหล่านี้เราสามารถสรุปได้ว่าmap
มีประโยชน์ด้านประสิทธิภาพมากกว่ารายการความเข้าใจในกรณีนี้ นอกจากนี้ยังมีผลบังคับใช้ถ้าคุณกำลังพยายามที่จะโยนอย่างใดอย่างหนึ่งหรือint
str
สำหรับรายการจำนวนน้อยที่มีองค์ประกอบน้อยกว่าต่อรายการความแตกต่างนั้นเล็กน้อย สำหรับรายการขนาดใหญ่ที่มีองค์ประกอบมากขึ้นต่อรายการหนึ่งอาจต้องการใช้map
แทนรายการเข้าใจ แต่ทั้งหมดขึ้นอยู่กับความต้องการของแอปพลิเคชัน
map
แต่ผมเองพบความเข้าใจในรายชื่อที่จะอ่านได้มากขึ้นและสำนวนกว่า เป็นมาตรฐานจริงในหลาม คนมักจะมีความเชี่ยวชาญมากขึ้นและสะดวกสบาย (พิเศษเริ่มต้น) map
ในการใช้ความเข้าใจรายการกว่า