Недавно я работал над созданием программы поиска простых чисел. Однако я заметил, что одна функция была намного медленнее, когда она использовала аргументы, чем когда она использовала предварительно установленные значения.
В трех разных версиях становится ясно, что переменные значительно замедляют работу программы, и я хотел бы знать, почему.
Версия 1: 7.5 секунд
Здесь была оригинальная (несколько упрощенная для этого вопроса) функция:
def version1(n, p):
return ((n*n - 2) & ((1 << p) - 1)) + ((n*n - 2) >> p)
При запуске с модулем timeit
100 раз:
timeit.timeit("version1(200, 500000000)", "from __main__ import version1", number=100)
требуется 7.5
секунд.
Версия 2: 0.0001 секунд
Однако, вот вторая версия, в которой нет параметров, и числа непосредственно помещаются в возвращаемое значение. Эквадор точно такой же, как версия 1:
def version2():
return ((200*200 - 2) & ((1 << 500000000) - 1)) + ((200*200 - 2) >> 500000000)
При запуске с модулем timeit
100 раз:
timeit.timeit("version2()", "from __main__ import version2", number=100
в этом случае требуется только 0.00001
секунд!
Версия 3: 6,3 секунды
Наконец, для полноты я попробовал версию, которая не имела параметров, но сохранила ее значения как переменные:
def version3():
n = 200
p = 500000000
return ((n*n - 2) & ((1 << p) - 1)) + ((n*n - 2) >> p)
При запуске с timeit
:
timeit.timeit("version3()", "from __main__ import version3", number = 100)
потребовалось 6.3
секунд, что относительно близко к версии 1.
Почему одна и та же функция может занимать намного больше времени, когда есть переменные, и как я могу сделать Версию 1 более эффективной?