【发布时间】:2013-07-05 04:08:03
【问题描述】:
有没有办法避免在这个 Julia 表达式中创建数组:
max((filter(n -> string(n) == reverse(string(n)), [x*y for x = 1:N, y = 1:N])))
并使其行为类似于此 Python 生成器表达式:
max(x*y for x in range(N+1) for y in range(x, N+1) if str(x*y) == str(x*y)[::-1])
由于数组分配和 N*N 次迭代与 Python 的 N*N/2 相比,Julia 版本比 Python 慢 2.3 倍。
编辑
在 Julia 中尝试了一些实现之后,我得到的最快的循环样式版本是:
function f(N) # 320ms for N=1000 Julia 0.2.0 i686-w64-mingw32
nMax = NaN
for x = 1:N, y = x:N
n = x*y
s = string(n)
s == reverse(s) || continue
nMax < n && (nMax = n)
end
nMax
end
但改进后的功能版本也紧随其后(如果您考虑 2 倍大的域,则仅慢 14% 或显着快):
function e(N) # 366ms for N=1000 Julia 0.2.0 i686-w64-mingw32
isPalindrome(n) = string(n) == reverse(string(n))
max(filter(isPalindrome, [x*y for x = 1:N, y = 1:N]))
end
与本页顶部的原始版本相比,通过定义isPalindrome 函数,性能提高了 2.6 倍。
【问题讨论】:
-
干得好。你可以在这里写
filter(isPalindrome, ...)。 -
@StefanKarpinski 谢谢,现在看起来好多了。
标签: generator list-comprehension julia