有没有办法避免在这个 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 倍的意外性能提升。