Iteration vs Spaceการใช้งานอาจเป็นปัญหา ในสถานการณ์ต่างๆการทำโปรไฟล์อาจแสดงว่า "เร็วกว่า" และ / หรือ "ใช้หน่วยความจำน้อย" แบบเข้มข้น
# first
>>> L = [0, 23, 234, 89, None, 0, 35, 9, ...]
>>> [x for x in L if x is not None]
[0, 23, 234, 89, 0, 35, 9, ...]
# second
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> for i in range(L.count(None)): L.remove(None)
[0, 23, 234, 89, 0, 35, 9, ...]
แรกวิธีการ (ในขณะที่ยังมีข้อเสนอแนะโดย@jamylak , @Raymond Hettingerและ@Dipto ) สร้างรายชื่อที่ซ้ำกันในหน่วยความจำซึ่งอาจจะเป็นค่าใช้จ่ายสำหรับรายการใหญ่ที่มีไม่กี่None
รายการ
สองวิธีจะต้องผ่านรายการครั้งเดียวแล้วอีกครั้งในแต่ละครั้งจนกว่าNone
จะถึง นี่อาจเป็นความจำที่น้อยกว่าและรายการจะเล็กลงตามไปด้วย การลดขนาดรายการอาจมีความเร็วมากขึ้นสำหรับNone
รายการที่อยู่ข้างหน้า แต่กรณีที่แย่ที่สุดคือถ้ามีNone
รายการอยู่ด้านหลังมากมาย
เทคนิคการขนานและการเข้าแทนที่เป็นวิธีการอื่น ๆ แต่แต่ละวิธีมีความยุ่งยากใน Python การรับรู้ข้อมูลและการใช้งานแบบรันไทม์รวมถึงการทำโปรไฟล์โปรแกรมเป็นจุดเริ่มต้นสำหรับการดำเนินการที่เข้มข้นหรือข้อมูลขนาดใหญ่
การเลือกวิธีการอย่างใดอย่างหนึ่งอาจไม่สำคัญในสถานการณ์ทั่วไป มันกลายเป็นความพึงพอใจของสัญกรณ์มากกว่า ในความเป็นจริงในสถานการณ์ที่ผิดปกติเหล่านั้นnumpy
หรือcython
อาจเป็นทางเลือกที่คุ้มค่าแทนการพยายามเพิ่มประสิทธิภาพ Prom ของ micromanage
filter
รุ่นที่หรูหราน้อยกว่า:filter(lambda x: x is not None, L)
- คุณสามารถกำจัดการlambda
ใช้งานpartial
และoperator.is_not
ฉันคิดว่า แต่อาจไม่คุ้มค่าเนื่องจาก list-comp สะอาดกว่ามาก