当前位置: 首页 > 知识库问答 >
问题:

Julia,加速eval

叶煌
2023-03-14

Julia有一个非常好的特性,可以访问自己的语法树,这使得以编程方式生成新函数变得很容易,但它比普通的Julia代码慢得多。

例如:

julia> timing = @time for i in [1:100] tan(pi/2*rand()); end
elapsed time: 1.513e-5 seconds (896 bytes allocated)

julia> timing = @time for i in [1:100] x = pi/2*rand(); eval(:(tan(x))); end
elapsed time: 0.0080231 seconds (23296 bytes allocated)

julia> timing = @time for i in [1:100]  eval(:(tan(pi/2*rand()))); end
elapsed time: 0.017245327 seconds (90496 bytes allocated)

有没有办法给eval提供与普通Julia代码相同的速度?

julia> tmp3 = :(sin(x))
:(sin(x))

julia> timing = @time for i in [1:100000] x = pi/2*rand(); eval(tmp3); end
elapsed time: 8.651145772 seconds (13602336 bytes allocated)

julia> precompile(tmp3,(Float64,Float64))

julia> timing = @time for i in [1:100000] x = pi/2*rand(); eval(tmp3); end
elapsed time: 8.611654016 seconds (13600048 bytes allocated)

@Ivarne建议我提供我的项目的细节。我想使用Julia的元编程功能来计算符号导数并运行它们。

我编写了一个函数导数(ex::expr,arg::symbol),它接受and表达式和一个参数,并返回一个新表达式,该表达式是ex相对于arg的导数。不幸的是,结果expr需要太长时间来计算。

Edit3:作为结论,使用@eval而不是eval的性能:

julia> timing = @time for i in [1:100000] x = pi/2*rand(); @eval(tmp3); end
elapsed time: 0.005821547 seconds (13600048 bytes allocated)

共有1个答案

慕容劲
2023-03-14

如果需要速度,就不应该使用eval,因为它每次都要做大量的工作来生成优化的快速代码。

如果您想要操作表达式,您应该转而查看宏。它们对表达式进行操作,并返回将编译一次的表达式。见http://docs.julialang.org/en/latest/manual/metaprogramming/。

如果您提供一些问题的细节,而不仅仅是在eval上进行性能测试,那么将更容易为您指明正确的方向。使julia中的eval更快是一个项目,而不是StackOverflow的问题。

myexpr = :(sin(x))
myexpr_dx = derivative(myxpr)
@eval myfun(x) = $myexpr
@eval myfun_dx(x) = $myexpr_dx 
 类似资料:
  • 我有一个浮点数的 MxN 数组 A,我想进行以下操作:对于 A 的每一列,计算小于某个阈值(例如 0.5)的元素数量。 Julia执行此操作的最快方法是使用零初始化结果向量,然后按列遍历数组A并在需要时递增结果向量。例如,使用for循环执行此操作很容易 这将按照与内存中的布局相同的顺序遍历 A,并且不会分配不必要的额外空间。但是,我不确定如何使用例如广播运营商来实现这一点。 但是这只是为了执行操作

  • 移动应用开发框架已经有很多,比如PhoneGap、jQuery Touch、Sencha和Titanium。为什么还需要另外一个? PhoneGap,比较出名的一个跨平台解决方案。但是PhoneGap并不支持UI设计,它仅仅是浏览器调用本机代码(比如获取地理位置)的一层接口。UI设计还需要别的JS类库支持。在Google的NexusOne(1G的CPU)上面测试,加载一个PhoneGap和jQue

  • julia-vim Julia support for Vim. INSTALLATION INSTRUCTIONS Complete documentation The full documentation is available from Vim: after installation, you just need to type :help julia-vim. The remainder

  • Julia Studio 是 Julia 编程语言的集成开发环境,基于 Qt Creator 和 Qt 框架,除了一个编辑器和集成控制台之外还包括了内置支持 git 版本控制。另外,使用标准 Julia 包可以快速实现数据可视化。 支持的平台 Mac OSX 10.6 及更高版本 Windows XP SP2 及更高版本 (K)Ubuntu Linux 12.04 及更高版本

  • 你可以通过执行npm run preview -- --report来分析webpack打包之后的结果,观察各个静态资源的大小。你可以发现占用空间最多的是第三方依赖。如vue、element-ui、 ECharts等。 你可以使用 CDN 外链的方式引入这些第三方库,这样能大大增加构建的速度(通过 CDN 引入的资源不会经 webpack 打包)。如果你的项目没有自己的CDN服务的话,使用一些第三

  • 加速计 jd.startAccelerometer(Object object) 开始监听加速度数据。 参数 Object object 属性 类型 默认值 必填 说明 interval string normal 否 监听加速度数据回调函数的执行频率 success function 否 接口调用成功的回调函数 fail function 否 接口调用失败的回调函数 complete funct