Я запускаю Python 2.7.10 на машине i5 с тактовой частотой 16 ГБ, 2,7 ГГц и OSX 10.11.5.
Я наблюдал это явление много раз на многих различных типах примеров, поэтому приведенный ниже пример, хотя и немного надуманный, является показательным. Это как раз то, над чем мне довелось работать сегодня утром, когда мое любопытство, наконец, разразилось.
>>> timeit('unicodedata.category(chr)', setup = 'import unicodedata, random; chr=unichr(random.randint(0,50000))', number=100)
3.790855407714844e-05
>>> timeit('unicodedata.category(chr)', setup = 'import unicodedata, random; chr=unichr(random.randint(0,50000))', number=1000)
0.0003371238708496094
>>> timeit('unicodedata.category(chr)', setup = 'import unicodedata, random; chr=unichr(random.randint(0,50000))', number=10000)
0.014712810516357422
>>> timeit('unicodedata.category(chr)', setup = 'import unicodedata, random; chr=unichr(random.randint(0,50000))', number=100000)
0.029777050018310547
>>> timeit('unicodedata.category(chr)', setup = 'import unicodedata, random; chr=unichr(random.randint(0,50000))', number=1000000)
0.21139287948608398
Вы заметите, что от 100 до 1000, как и ожидалось, время увеличивается в 10 раз. Однако от 1e3 до 1e4 это больше похоже на множитель 50, а затем на множитель 2 от 1e4 до 1e5 (так что общий множитель 100 от 1e3 до 1e5, что и ожидается).
Я полагал, что должна происходить какая-то оптимизация на основе кеширования либо в фактическом синхронизируемом процессе, либо в самом timeit
, но я не могу понять эмпирически так, так ли это. Импорт, похоже, не имеет значения, как это можно увидеть на простейшем примере:
>>> timeit('1==1', number=10000)
0.0005490779876708984
>>> timeit('1==1', number=100000)
0.01579904556274414
>>> timeit('1==1', number=1000000)
0.04653501510620117
где от 1e4 до 1e6 истинная разница во времени равна 1e2, но промежуточные шаги составляют ~ 30 и ~ 3.
Я мог бы собирать больше специальных данных, но на данный момент у меня нет гипотезы.
Любое представление о том, почему нелинейная шкала при определенных промежуточных количествах прогонов?
timeit('1==1', number=10000)
несколько раз и наблюдайте за колебаниями. Вы в основном наблюдаете за шумом. Ваш процесс может быть вытеснен другим процессом, или разрешение таймера может быть недостаточно высоким для точного определения таких коротких времен. - person Sven Marnach   schedule 27.09.2016