【发布时间】:2022-01-19 06:36:23
【问题描述】:
我在 Python/Numpy 中使用了一个函数来解决 combinatorial game theory 中的一个问题。
import numpy as np
from time import time
def problem(c):
start = time()
N = np.array([0, 0])
U = np.arange(c)
for _ in U:
bits = np.bitwise_xor(N[:-1], N[-2::-1])
N = np.append(N, np.setdiff1d(U, bits).min())
return len(*np.where(N==0)), time()-start
problem(10000)
然后我用 Julia 编写它,因为我认为 Julia 使用即时编译会更快。
function problem(c)
N = [0]
U = Vector(0:c)
for _ in U
elems = N[1:length(N)-1]
bits = elems .⊻ reverse(elems)
push!(N, minimum(setdiff(U, bits)))
end
return sum(N .== 0)
end
@time problem(10000)
但第二个版本要慢得多。对于 c = 10000,Python 版本需要 2.5 秒。在 Core i5 处理器上,Julia 版本需要 4.5 秒。由于 Numpy 操作是用 C 实现的,我想知道 Python 是否确实更快,或者我正在编写一个浪费时间复杂度的函数。
Julia 中的实现分配了大量内存。如何减少分配次数以提高其性能?
【问题讨论】:
-
问自己“语言 X 比语言 Y 快吗?”通常是红鲱鱼。除了诸如不同实现之类的技术细节之外,大多数语言都不是“纯”使用的——比如你的 Python 程序通过
numpy调用编译语言的代码——而且没有免费的午餐:JIT 以牺牲长期性能为代价短期热身。 您在 Julia 中的特定程序比在 Python 中的您的特定程序慢。 -
从 1 个数据点推断“X 是否优于 Y”有点危险,你不觉得吗?
-
我认为这不应该被关闭。它需要一些编辑,但具体的比较是在主题上。
-
Julia 中的代码编写效率不高。主要的低效率是它进行了大量的数据复制和分配(请注意,在 Python 中索引创建一个视图,而不是 Julia,您必须选择加入)。我重新编写了它,以使 Julia 执行时间提高约 40 倍。我已经编辑了问题以反映这一点并投票重新打开
-
setdiff的性能在 Python 和 Julia 之间可能有所不同,但我不明白为什么 Julia 应该在这里变慢 - 这是一个可能经过优化的基本库函数。如果是,那么它应该在 Julia 中修复。我没有在我当前的机器上安装 Python 来进行基准测试。另一方面,从原始代码中可以清楚地看出它在几个地方进行了不必要的分配,因此我的评论。
标签: python julia game-theory