ดังนั้นฉันจึงทำการเปรียบเทียบความเร็วเพื่อให้ได้วิธีที่เร็วที่สุด ความเข้าใจในรายการนั้นเร็วมาก วิธีเดียวที่จะเข้าใกล้ได้คือหลีกเลี่ยงการถูก exectuded bytecode ระหว่างการสร้างรายการ ความพยายามครั้งแรกของฉันคือวิธีการต่อไปนี้ซึ่งโดยหลักการแล้วจะเร็วกว่า:
l = [[]]
for _ in range(n): l.extend(map(list,l))
(สร้างรายการความยาว 2 ** n แน่นอน) โครงสร้างนี้ช้าเป็นสองเท่าของความเข้าใจรายการตามเวลาสำหรับรายการทั้งแบบสั้นและแบบยาว (หนึ่งล้านรายการ)
ความพยายามครั้งที่สองของฉันคือใช้ starmap เพื่อเรียกตัวสร้างรายการสำหรับฉันมีโครงสร้างหนึ่งซึ่งดูเหมือนจะเรียกใช้ตัวสร้างรายการด้วยความเร็วสูงสุด แต่ก็ยังช้ากว่า แต่เพียงเล็กน้อยเท่านั้น:
from itertools import starmap
l = list(starmap(list,[()]*(1<<n)))
เวลาดำเนินการที่น่าสนใจเพียงพอแสดงให้เห็นว่าเป็นการเรียกรายการสุดท้ายที่ทำให้โซลูชัน starmap ช้าเนื่องจากเวลาดำเนินการเกือบจะเท่ากับความเร็วของ:
l = list([] for _ in range(1<<n))
ความพยายามครั้งที่สามของฉันเกิดขึ้นเมื่อฉันรู้ว่ารายการ (()) สร้างรายการด้วยดังนั้นฉันจึงลองใช้วิธีง่ายๆอย่างเห็นได้ชัด:
l = list(map(list, [()]*(1<<n)))
แต่มันช้ากว่าการโทรแบบสตาร์แมป
สรุป: สำหรับคนบ้าความเร็ว: ใช้ความเข้าใจในรายการ ฟังก์ชั่นการโทรเท่านั้นถ้าคุณต้องการ ใช้บิลท์อิน
d = [[] for x in xrange(0,n)]ฉันจะต้องแปลกใจถ้ามีอะไรที่มีนัยสำคัญได้เร็วกว่า คุณต้องวนซ้ำอย่างชัดเจนใน Python หรือเรียกใช้ฟังก์ชัน Python / lambda ซ้ำ ๆ (ซึ่งควรจะช้ากว่า) แต่ก็ยังหวังว่าจะมีคนโพสต์บางอย่างที่แสดงว่าฉันผิด :).