0
0 комментариев

У меня есть следующие два варианта кода для Cython:

Вариант 1:

cpdef prime(int n):
    cdef int i
    if n < 2: return False
    for i in xrange(3, int(n**0.5) + 2, 2):
        if not n % i: return False
    return True

Вариант 2:

cpdef prime(int n):
    cdef int i
    if n < -1: return False
    for i in xrange(3, int(n**0.5) + 2, 2):
        if not n % i: return False
    return True

Как видно, единственная разница в строке:

if n < -1: return False

Вызывается один из вариантов этого кода из Python самым обычным образом:

for i in xrange(10000):
    result = prime(1007963447)

Проверяю только на этом числе, никаких n < 2, а тем более n < -1.

Время выполнения для каждого варианта:

Вариант 1: 1.20464787483
Вариант 2: 0.90665817260

  • Если заменить строку if n < 2: return False на if False: return
    или if n < 0: pass, время выполнения опять возрастает до ~1.10sec.
  • Если заменить на if n < 0: return False или if n < 0: return, то
    время выполнения не меняется (~0.9sec).
  • Если вообще убрать эту строку, то время выполнения возрастает до
    ~1.10sec.

Пробовал разные варианты. Среда разработки, кодировки и фазы луны не влияют на результат, влияет только эта строка.

Вопрос: почему такие бессмысленные изменения ускоряют\змедляют работу кода? Или я чего-то не понимаю?

UPD. Вот наглядная разница в сгенерированных файлах "*.c": Diff Online

Единственная разница в соответствующих строках:

pyx_t_1 = ((__pyx_v_n < -1) != 0);

и

pyx_t_1 = ((__pyx_v_n < 2) != 0);

UPD2. Также добавил сравнение ассемблерных листингов (слева n<2): Assembler listing


Добавить комментарий