def sieve(n):
nums = [0] * n
for i in range(2, int(n**0.5)+1):
if nums[i] == 0:
for j in range(i*i, n, i):
nums[j] = 1
return [i for i in range(2, n) if nums[i] == 0]
def sieve_var(n):
nums = [0] * n
for i in range(3, int(n**0.5)+1, 2):
if nums[i] == 0:
for j in range(i*i, n, i):
nums[j] = 1
return [2] + [i for i in range(3, n, 2) if nums[i] == 0]
На моей машине sieve(10**8)
занимает 2,28 с, а sieve_var(10**8)
- 2,67 с. Я не думаю, что время PIPY-разминки является виновником здесь, так почему же не sieve_var
, который повторяет меньше, быстрее? В стандартном python 3.3 sieve_var
работает быстрее, чем ожидалось. Использование pypy 4.0.1 32bit в Windows 8.1.
Изменить: В качестве теста я добавил count = 0
в начале функции и count += 1
внутри внутреннего цикла (где nums[j] = 1
). sieve(10**8)
подсчитывается 242570202, а sieve_var(10**8)
- 192570204. Таким образом, хотя счетчик не уменьшается в два раза для sieve_var
, он делает меньше "работы".