Я просто возился, когда наткнулся на эту причуду. И я хотел убедиться, что я не сумасшедший.
Следующий код (работает в 2.x и 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))
Выполнение 3 прогона на каждой версии, на той же машине.
Примечание: я сгруппировал тайминги в той же строке, чтобы сэкономить место здесь.
На моем Python 2.7.5:
gen: 2.37875941643, 2.44095773486, 2.41718937347
list: 2.1132466183, 2.12248106441, 2.11737128131
На моем Python 3.3.2:
gen: 3.8801268438439718, 3.9939604983350185, 4.166233972077624
list: 2.976764740845537, 3.0062614747229555, 3.0734980312273894
Интересно, почему это... Может ли это иметь какое-то отношение к тому, как реализованы строки?
EDIT: Я сделал это снова, не используя range()
, так как это также немного изменилось с 2.x до 3.x Вместо этого я использую новый код ниже:
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))
Сроки для Python 2.7.5:
gen: 2.13911803683, 2.16418448199, 2.13403650485
list: 0.797961223325, 0.767758578433, 0.803272800119
Сроки для Python 3.3.2:
gen: 2.8188347625218486, 2.882846655874985, 3.0317612259663718
list: 1.3590610502957934, 1.4878876089869366, 1.4978070529462615
EDIT2: Кажется, что было еще несколько вещей, отбрасывающих расчет, поэтому я попытался свести его к минимуму.
Новый код:
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
Разница очевидна, она быстрее в 2.x и медленнее в 3.x И мне любопытно, почему...