วิธีที่ดีที่สุดในการสร้างรายการว่างใหม่ใน Python คืออะไร?
l = []
หรือ
l = list()
ฉันถามสิ่งนี้เพราะสองสาเหตุ:
- เหตุผลทางเทคนิคซึ่งเป็นสิ่งที่เร็ว (การสร้างคลาสทำให้เกิดค่าใช้จ่ายหรือไม่)
- ความสามารถในการอ่านโค้ด - อันไหนเป็นแบบแผนมาตรฐาน
วิธีที่ดีที่สุดในการสร้างรายการว่างใหม่ใน Python คืออะไร?
l = []
หรือ
l = list()
ฉันถามสิ่งนี้เพราะสองสาเหตุ:
คำตอบ:
นี่คือวิธีที่คุณสามารถทดสอบว่าโค้ดใดเร็วกว่า:
% python -mtimeit "l=[]"
10000000 loops, best of 3: 0.0711 usec per loop
% python -mtimeit "l=list()"
1000000 loops, best of 3: 0.297 usec per loop
อย่างไรก็ตามในทางปฏิบัติการเริ่มต้นนี้น่าจะเป็นส่วนเล็ก ๆ ของโปรแกรมของคุณดังนั้นการกังวลเกี่ยวกับเรื่องนี้อาจเป็นเรื่องที่ผิด
การอ่านเป็นเรื่องส่วนตัวมาก ฉันชอบ[]
แต่คนที่มีความรู้มากเช่น Alex Martelli ชอบlist()
เพราะออกเสียงได้
list('')
ให้[]
แทน['']
?
list('abcd')
แล้วคุณเข้าใจทุกอย่าง)
list()
ช้ากว่า[]
เพราะโดยธรรมชาติ
มีการค้นหาสัญลักษณ์ (ไม่มีวิธีใดที่หลามจะรู้ล่วงหน้าหากคุณไม่ได้กำหนดรายการใหม่เพื่อให้เป็นอย่างอื่น!)
มีการเรียกใช้ฟังก์ชัน
จากนั้นจะต้องตรวจสอบว่ามีข้อโต้แย้งที่ผ่าน iterable (เพื่อให้สามารถสร้างรายการที่มีองค์ประกอบจากมัน) ps ไม่มีในกรณีของเรา แต่มี "ถ้า" ตรวจสอบ
ในกรณีส่วนใหญ่ความแตกต่างความเร็วจะไม่สร้างความแตกต่างในทางปฏิบัติใด ๆ
list()
ช้ากว่า[]
!
list()
มีเพียงเพื่อตรวจสอบว่ามีข้อโต้แย้งใด ๆ เลย ... "ตรวจสอบว่า iterable" และ "สร้างรายการที่มีองค์ประกอบ" ก็ไม่ได้เกิดขึ้น; พวกเขาใช้เฉพาะในกรณีที่มีหาเรื่อง มันเป็นไปได้แม้กระทั่งว่ารหัส C สำหรับ[]
สาย C list()
รหัสเดียวกับ ไม่ว่าในกรณีใดเวลาที่ใช้ใน (c) จะน้อยเมื่อเทียบกับ (a) + (b)
[]
ฉันใช้
ฉันไม่รู้จริงๆเกี่ยวกับเรื่องนี้ แต่ดูเหมือนว่าสำหรับฉันโดยประสบการณ์แล้ว jpcgt นั้นถูกต้องแล้ว ตัวอย่างต่อไปนี้: ถ้าฉันใช้รหัสต่อไปนี้
t = [] # implicit instantiation
t = t.append(1)
ในล่ามแล้วโทร t ให้ฉันเพียง "t" โดยไม่มีรายการใด ๆ และถ้าฉันผนวกสิ่งอื่นเช่น
t = t.append(2)
ฉันได้รับข้อผิดพลาด "วัตถุไม่มีประเภท" ไม่มีแอตทริบิวต์ "ผนวก" " อย่างไรก็ตามถ้าฉันสร้างรายการโดย
t = list() # explicit instantiation
จากนั้นก็ใช้งานได้ดี
t.append(1)
ปรับเปลี่ยนt
ในสถานที่ก็ไม่ได้อะไร แต่กลับNone
และคุณกำลังกำหนดนี้ไปNone
t
ดังนั้นt
อ้างอิงตอนนี้None
แทนที่จะไปที่รายการ ความผิดพลาดของคุณที่นี่คือการเขียนแทนเพียงt=t.append(1)
t.append(1)
คุณจะสังเกตเห็นพฤติกรรมเดียวกันกับlist()
ดังนั้นจึงไม่มีความแตกต่างที่นี่
เพียงเพื่อเน้น @Darkonaut คำตอบเพราะฉันคิดว่ามันควรจะมองเห็นได้มากขึ้น
new_list = []
หรือnew_list = list()
ทั้งคู่ก็ดี (ไม่สนใจประสิทธิภาพ) แต่append()
ส่งคืนNone
เนื่องจากคุณไม่สามารถทำได้new_list = new_list.append(something
เป็นผลคุณไม่สามารถทำ
ฉันงงมากกับการตัดสินใจแบบย้อนกลับ yuck