2015-01-07 2 views
3

Я пробовал синхронизировать некоторые из моего кода и заметил некоторые действительно странные результаты с pypy. Посмотрите на этот пример:Почему часы pypy() настолько неточны?

from time import clock 
from random import randint 

times = [] 
for _ in range(10): 
    start = clock() 
    sum(i * i for i in range(randint(1000000, 2000000))) # waste time 
    end = clock() 
    times.append(int((end - start) * 1000000)) 

for t in times: 
    print(t, "µs") 

Бег с python3, есть куча случайных результатов, как и ожидалось:

506246 µs 
461735 µs 
403287 µs 
472049 µs 
651156 µs 
609496 µs 
467181 µs 
633187 µs 
562603 µs 
744360 µs 

Бег с PyPy, кажется, что все это лишь с точностью до одной трети секунды :

43332 µs 
36667 µs 
30000 µs 
23332 µs 
19999 µs 
23334 µs 
26665 µs 
20000 µs 
36667 µs 
26666 µs 

Почему?

+1

@ColonelThirtyTwo, если вы посмотрите на дисперсию чисел, вы увидите, что результаты pypy всегда выровнены на 1/30 (не 1/3) вторых границах, в отличие от результатов Python3. –

+0

Я не вижу таких результатов. Когда я запускаю эту программу в Windows 7 с использованием Python 2.7, PyPy 2.4.0 и PyPy3 2.4.0, все они, как представляется, имеют одинаковую случайность и точность (вплоть до по меньшей мере микросекунд). –

ответ

1

Ответы Марка правильные в теории, но это действительно ошибка. Пожалуйста, откройте ошибку в контролере ошибок PyPy, указав точно, какую платформу и версию PyPy вы используете (я, кажется, правильно понял Linux и John на Windows).

+0

Я сейчас нахожусь на Arch Linux прямо сейчас, поэтому, я полагаю, это не так точно в Linux. – Undeterminant

1

От Python documentation:

Точность, и фактически само определение значения «процессорного времени», зависит от того, что функции С одного и того же имени.

Точность будет отличаться для разных вариантов реализации. В этом случае pypy, похоже, использует таймер с периодом 1/30 секунды, поэтому точность никогда не будет лучше.