gpt4 book ai didi

generator - 有没有办法避免在这个 Julia 表达式中创建数组?

转载 作者:行者123 更新时间:2023-12-03 18:16:04 25 4
gpt4 key购买 nike

有没有办法避免在这个 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 倍。功能,与此页面顶部的原始版本相比。

最佳答案

我们已经讨论过允许语法

max(f(x) for x in itr)

作为生成每个值的简写 f(x)在一个协程中计算另一个协程中的最大值。这基本上是这样的简写:
max(@task for x in itr; produce(f(x)); end)

但是请注意,这种显式创建任务的语法已经有效,尽管它不如上面的漂亮。你的问题可以这样表达:
max(@task for x=1:N, y=x:N
string(x*y) == reverse(string(x*y)) && produce(x*y)
end)

使用上面假设的生产者语法,它可以简化为如下所示:
max(x*y if string(x*y) == reverse(string(x*y) for x=1:N, y=x:N)

虽然我是函数式风格的粉丝,但在这种情况下,我可能只会使用 for 循环:
m = 0
for x = 1:N, y = x:N
n = x*y
string(n) == reverse(string(n)) || continue
m < n && (m = n)
end

就个人而言,我不觉得这个版本更难阅读,而且在 Julia 中肯定会很快。一般来说,虽然函数式风格既方便又漂亮,但如果您的主要关注点是性能,那么显式 for 循环是您的 friend 。尽管如此,我们应该确保 John 的 max/filter/product 版本有效。 for 循环版本还使其他优化更容易添加,例如 Harlan 建议颠倒循环顺序并在您找到的第一个回文时退出。还有比实际创建和比较字符串更快的方法来检查一个数字是否是给定基数中的回文。

至于“在 Julia 中获得灵活的生成器和列表推导”的一般问题,该语言已经有了
  • 基于 start/done/next 函数的通用高性能迭代协议(protocol)。
  • 比大多数语言更强大的多维数组理解。此时,唯一缺少的功能是 if守卫,这由于与多维理解的交互以及潜在地动态增长结果数组的需要而变得复杂。
  • 协程(又名任务),除其他模式外,还允许生产者-消费者模式。

  • Python 有 if守卫但几乎不担心理解性能——如果我们要将该功能添加到 Julia 的理解中,我们将以一种既快速又与多维数组交互良好的方式来完成,因此延迟。

    更新: max函数现在称为 maximum ( maximummax 因为 sum+ )并且生成器语法和/或过滤器在 master 上工作,因此例如,您可以这样做:
    julia> @time maximum(100x - x^2 for x = 1:100 if x % 3 == 0)
    0.059185 seconds (31.16 k allocations: 1.307 MB)
    2499

    一旦 0.5 出来,我会更彻底地更新这个答案。

    关于generator - 有没有办法避免在这个 Julia 表达式中创建数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17516250/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com