Tôi đã chỉ rối tung xung quanh khi tôi đi qua quirk này. Và tôi muốn chắc chắn rằng tôi không điên.Có phải "tham gia" chậm hơn trong phiên bản 3.x không?
Các mã sau (chỉ hoạt động trong 2.x và 3.x):
from timeit import timeit
print ('gen: %s' % timeit('"-".join(str(n) for n in range(1000))', number=10000))
print ('list: %s' % timeit('"-".join([str(n) for n in range(1000)])', number=10000))
Làm 3 chạy trên mỗi phiên bản, cùng một máy.
lưu ý: Tôi đã nhóm thời gian trên cùng một dòng để tiết kiệm không gian tại đây.
Mở Python 2.7.5:
gen: 2.37875941643, 2.44095773486, 2.41718937347
list: 2.1132466183, 2.12248106441, 2.11737128131
Mở Python 3.3.2:
gen: 3.8801268438439718, 3.9939604983350185, 4.166233972077624
list: 2.976764740845537, 3.0062614747229555, 3.0734980312273894
Tôi tự hỏi tại sao điều này là .... nó có thể có một cái gì đó để làm với cách dây được thực hiện?
EDIT: tôi đã làm nó một lần nữa mà không sử dụng range()
vì đó cũng đã thay đổi chút ít so với 2.x để 3.x Thay vào đó tôi sử dụng mã mới dưới đây:
from timeit import timeit
print ('gen: %s' % timeit('"-".join(str(n) for n in (1, 2, 3))', number=1000000))
print ('list: %s' % timeit('"-".join([str(n) for n in (1, 2, 3)])', number=1000000))
thời gian cho Python 2.7.5:
gen: 2.13911803683, 2.16418448199, 2.13403650485
list: 0.797961223325, 0.767758578433, 0.803272800119
thời gian cho Python 3.3.2:
gen: 2.8188347625218486, 2.882846655874985, 3.0317612259663718
list: 1.3590610502957934, 1.4878876089869366, 1.4978070529462615
EDIT2: Có vẻ như đã có một số điều hơn ném ra khỏi tính toán, vì vậy tôi đã cố gắng đưa nó xuống đến một trần tối thiểu.
Mã mới:
from timeit import timeit
print ('gen: %s' % timeit('"".join(n for n in ("1", "2", "3"))', number=1000000))
print ('list: %s' % timeit('"".join([n for n in ("1", "2", "3")])', number=1000000))
Timing Python 2.7.5:
gen: 1.47699698704, 1.46120314534, 1.48290697384
list: 0.323474182882, 0.301259632897, 0.323756694047
Timing Python 3.3.2:
gen: 1.633002954259608, 1.6049987598860562, 1.6109927662465935
list: 0.5621341113519589, 0.5789849850819431, 0.5619928557696119
Sự khác biệt là rõ ràng, đó là nhanh hơn trong 2.x và chậm hơn trong 3.x Và tôi tò mò là tại sao ...
Trong Python 3, ' dải ô' hoạt động giống như 'xrange' trước đây. Python 2 có thể lưu vào bộ nhớ đệm danh sách được tạo rõ ràng, cung cấp tốc độ quan sát được. (Điều này cũng sẽ giải thích tại sao phiên bản danh sách nhanh hơn phiên bản máy phát điện trong cả 2 và 3.) – chepner
http://docs.python.org/3.0/whatsnew/3.0.html#performance –
@chepner Bạn có một điểm . Tôi đã thử lại bằng cách sử dụng '" x "* 1000' thay vì các hàm phạm vi. Và vẫn còn 2.x là nhanh hơn. –