Почему эти коды Python работают по-разному

Пожалуйста, посмотрите следующий код, чтобы решить тот же набор проблем, я не думаю, что упоминание проблемы каким-либо образом помогло бы цели, это еще одна итерация Проблема Джозефуса:

Решение 1:

import sys
from math import log

cases= int(sys.stdin.readline())
current= 0
while current < cases:
    current += 1
    n = int(sys.stdin.readline())
    print 2*(n - 2**(int(log(n,2))))+1

Это решение решает данные 10 тестовых случаев в сумме 1.0912 секунд и потребляет 4360 Кбайт памяти.

Решение 2:

def josephus_2( n ):
    from math import log
    return 2*(n - 2**(int(log(n,2))))+1

import sys
cases= int(sys.stdin.readline())
current= 0
while current < cases:
    current += 1
    n = int(sys.stdin.readline())
    print josephus_2( n )

это решение разрешает те же 10 тестовых случаев в общей сложности 1.0497 секунд и 640 Кбайт памяти.

Будучи Python n00b, мне было интересно, в то время как, по словам онлайн-судьи, я зарабатываю одинаковые очки для обоих, но что делает решение 2 быстрее, чем 1 и намного больше памяти? Я знаю, что разница во времени может звучать очень мало, но в то же время меня сначала оценивает самое быстрое решение, даже быстрее, чем представления c/С++/perl

Может ли этот скриншот помочь?

Ответ 1

В моих старых опытах я помню, что я обнаружил, что иногда вычисление частей функции (метода) может улучшить производительность:
Я просто переучился, используя следующий простой код:

n = 1000000
def compute(n):
    j = 0
    for i in xrange(n):
        j += 1

tic()
compute(n)
toc()

>>> 0.271 s

tic()
j = 0
for i in xrange(n):
    j += 1
toc()

>>> 0.849 s

Результат показывает 0.271s для первого (используя вычисление) против 0.849s как встроенный код. Это заметное улучшение, не меняя ничего в основной части вычислений! Таким образом, точка использует метод, который может улучшить производительность.

Вот код, который вы можете использовать для сравнения производительности:

from __future__ import division
from time import clock

def compute(n):
    j = 0
    for i in xrange(n):
        j += 1

n = 1000000
print 'solution (2) using a method call...'
t0 = clock()
compute(n)
print clock()-t0
#>>> ~0.2415...                              #faster (solution 2)

print 'solution (1) all inline code...'
t0 = clock()
j = 0
for i in xrange(n):
    j += 1
print clock()-t0
#>>> ~0.6169...                              #slower (solution 1)