Sử dụng insert
chức năng của danh sách chậm hơn nhiều so với việc đạt được hiệu quả tương tự bằng cách sử dụng phép gán lát:
> python -m timeit -n 100000 -s "a=[]" "a.insert(0,0)"
100000 loops, best of 5: 19.2 usec per loop
> python -m timeit -n 100000 -s "a=[]" "a[0:0]=[0]"
100000 loops, best of 5: 6.78 usec per loop
(Lưu ý rằng đó a=[]
chỉ là thiết lập, vì vậy a
bắt đầu trống nhưng sau đó tăng lên 100.000 phần tử.)
Lúc đầu, tôi nghĩ có thể đó là tra cứu thuộc tính hoặc gọi hàm trên hoặc như vậy, nhưng việc chèn gần cuối cho thấy điều đó không đáng kể:
> python -m timeit -n 100000 -s "a=[]" "a.insert(-1,0)"
100000 loops, best of 5: 79.1 nsec per loop
Tại sao chức năng "chèn phần tử đơn" chuyên dụng đơn giản hơn có lẽ lại chậm hơn nhiều?
Tôi cũng có thể sao chép nó tại repl.it :
from timeit import repeat
for _ in range(3):
for stmt in 'a.insert(0,0)', 'a[0:0]=[0]', 'a.insert(-1,0)':
t = min(repeat(stmt, 'a=[]', number=10**5))
print('%.6f' % t, stmt)
print()
# Example output:
#
# 4.803514 a.insert(0,0)
# 1.807832 a[0:0]=[0]
# 0.012533 a.insert(-1,0)
#
# 4.967313 a.insert(0,0)
# 1.821665 a[0:0]=[0]
# 0.012738 a.insert(-1,0)
#
# 5.694100 a.insert(0,0)
# 1.899940 a[0:0]=[0]
# 0.012664 a.insert(-1,0)
Tôi sử dụng Python 3.8.1 32 bit trên Windows 10 64 bit.
repl.it sử dụng Python 3.8.1 64 bit trên Linux 64 bit.
a=[1,2,3];a[100:200]=[4]
đang nối 4
đến cuối danh sách a
thú vị.
a=[]; a[0:0]=[0]
hoặc điều a[0:0]=[0]
đó giống như a[100:200]=[0]
...
a=[]; a[0:0]=[0]
nó giống nhưa=[]; a[100:200]=[0]