【发布时间】:2015-08-14 22:32:42
【问题描述】:
所以我有一个用 Python 和 Julia 编写的 Eratosthenes 函数的小筛子,我正在比较运行时间。
这是 Python 代码:
import time
def get_primes(n):
numbers = set(range(n, 1, -1))
primes = []
while numbers:
p = numbers.pop()
primes.append(p)
numbers.difference_update(set(range(p*2, n+1, p)))
return primes
start = time.time()
get_primes(10000)
print time.time() - start
这里是 Julia 代码:
function get_primes(n)
numbers = [2:n]
primes = Int[]
while numbers != []
p = numbers[1]
push!(primes, p)
numbers = setdiff(numbers, [p*i for i=1:int(n/p)])
end
return primes
end
@time get_primes(10000);
Python 代码的运行时间约为 0.005 秒,而 Julia 代码的运行时间约为 0.5 秒,这意味着 Python 的运行速度大约快了 100 倍。这可能有一个完全合乎逻辑的原因,但我真的不知道我在做什么。
【问题讨论】:
-
为什么你在 python 中使用 set 而在 Julia 中使用数组?
-
另外,尝试对第二次运行计时 - 第一次有编译开销
-
@IainDunning,Python 代码是从其他人那里逐字提取的,我在 Julia 中重写并清理了一下,但没有做任何清理 Python 代码的操作
-
我认为 Python 代码有问题。
set没有排序,尽管由于实现细节它可能似乎被排序。筛子非常需要按顺序计算素数。 -
@user1378571 不符合the documentation:“从集合中移除并返回任意元素。”
标签: python performance julia