朱莉娅,加速评估

2023-12-12

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 代码的速度相同吗?

编辑: 我能够使用以下方法稍微加快评估速度precompile功能,但这还不够:

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)

EDIT2:

@Ivarne 建议我提供有关我的项目的详细信息。好吧,我想使用 Julia 的元编程功能来计算符号导数并运行它们。

我写了一个函数derivative(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)

tmp3还是:(sin(x))


如果您需要速度,则不应使用 eval,因为它每次都必须做大量工作才能生成优化的快速代码。

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

如果您提供有关问题的一些详细信息,而不仅仅是 eval 上的性能测试,那么会更容易为您指明正确的方向。让 julia 中的 eval 更快是一个项目,而不是 StackOverflow 的问题。

Edit: 已经有一些这样的功能了微积分.jl,我认为最好是这样做:

myexpr = :(sin(x))
myexpr_dx = derivative(myxpr)
@eval myfun(x) = $myexpr
@eval myfun_dx(x) = $myexpr_dx 

这样你就可以得到一个可以计算的函数而不是表达式。然后,您可以对 myfun(x) 和 myfun_dx() 进行性能测试

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

朱莉娅,加速评估 的相关文章

  • Julia 转置 DataFrame 中的分组数据?

    ds Dataset group repeat 1 3 inner 2 b repeat 1 2 inner 3 c repeat 1 1 inner 6 d repeat 1 6 inner 1 e string a f 在inmemor
  • 有什么方法可以获取模块中定义的函数列表?

    是否有任何内省的魔法可以给我一个模块中定义的函数列表 module Foo function foo foo end function bar bar end end 一些神话般的功能 例如 functions in Foo 这将返回 fo
  • Julia 中的 @code_native、@code_typed 和 @code_llvm 有什么区别?

    在使用 julia 时 我想要有一个类似于 python 的功能dis模块 通过网络 我发现 Julia 社区已经解决了这个问题并给出了这些 https github com JuliaLang julia issues 218 https
  • 根据另一列的相应行值创建行子集?

    让 CSV 包含两列 年龄 和 性别 其中 Age 30 24 55 61 70 21 Gender Male Female Male Male Male Female 我希望它向我显示与 Gender Male 相对应的所有 Age 值
  • 如何在 Julia 1.0 中离线安装 julia 包?

    我有自己的 Julia 包 在 Julia 0 6 上运行良好 当我尝试升级到 Julia 1 0 时 我发现在 Julia 1 0 中添加我自己的包更加困难 我不能把它放在 pkg dir 下 在我的情况下 该包只是我本地磁盘上的几个文件
  • 朱莉娅中的矢量化“in”函数?

    我经常想要循环遍历数据帧的长数组或列 并且对于每个项目 查看它是否是另一个数组的成员 而不是做 giant list a c j good letters a b isin falses size giant list 1 for i 1
  • 如何在命令行中执行 Julia 代码?

    我最近在 Julia 中转移了我的代码 我想知道如何在命令行中执行 Julia 代码 我知道 Julia 代码可以通过运行一次来 编译 但问题是我需要对集 群上的模拟模型进行参数扫描 我只能使用命令行 而不能使用 REPL 在集群上运行模拟
  • Julia ccall 接口和符号的问题

    我正在尝试使用朱莉娅的ccall与 C 库接口的函数 所有类型和指针都是正确的 并且下面的函数调用成功返回正确的答案 为简洁起见 此处未显示变量定义和设置 ccall vDSP convD libacc Void Ptr T Int64 P
  • 我可以使用具有固定输入的“map”吗?

    假设我这样做f x y 2x ythen map f 2 4 6 1 1 1 我会得到 3 element Array Int64 1 5 9 13 If I do map f 2 4 6 1 即我想假设第二个输入始终相同 我会得到 1 e
  • Julia:生成唯一的随机整数数组

    我正在尝试创建 10 个唯一随机整数的元素数组 但是我无法创建具有唯一值的数组 Julia 中是否有类似 Python 的东西样本函数 https docs python org 2 library random html random s
  • Julia - 迭代字典中的键组合

    有没有一种巧妙的方法来迭代字典中的键组合 我的字典有这样的值 1 gt 1 2 2 3 gt 15 3 gt 6 7 8 4 9 11 gt 3 我需要做的是获取所有长度的键组合1 n where n可能是FX 3 就像上面的例子一样 我想
  • Julia 似乎没有使用字符串来执行插值

    官方文档指出 连接和字符串插值调用string 将对象转换为字符串形式 然而 以下最小工作示例似乎证明了其他情况 type MyType x Int end import Base string Base string m MyType w
  • @distributed 似乎有效,函数返回很不稳定

    我正在学习如何在 Julia 中进行并行计算 我在用着 sync distributed在 3x 嵌套的开始处for循环并行化事物 参见底部的代码 从线路上看println errCmp row col 我可以观察数组的所有元素errCmp
  • 具有单变量优化的 NLopt

    任何人都知道 NLopt 是否适用于单变量优化 尝试运行以下代码 using NLopt function myfunc x grad x 2 end opt Opt LD MMA 1 min objective opt myfunc mi
  • 从 Julia 中的文本文件读取数据矩阵

    我有一个包含矩阵的文本文件 我想在朱莉娅中将其作为矩阵来阅读 文本文件如下 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 0 在 matlab 中 您可以执行以下操作来创建矩阵M
  • 如何给DArray的元素设置值?

    我正在探索 Julia 的并行计算并尝试了以下方法 a dzeros 5 a 1 5 但刚刚收到此错误 setindex not defined for DArray Float64 1 Array Float64 1 嗯 我以为手册上说s
  • 并行模拟写入同一文件

    我的目标是在集群上并行运行 10 000 个左右的 Julia 编码模拟 每个模拟独立于所有其他模拟 每个模拟都有一个要输出的数字 以及有关哪个模拟产生该数字的 3 列信息 因此 强制每个模拟打印在单独的文件上对我来说听起来有点愚蠢 我可以
  • Julia:将数组数组转换为二维数组

    我有一个数组d包含一个浮点数组 julia gt d 99 element Array Array Float64 1 1 我正在尝试将其转换为二维数组 并且我成功地实现了我的目标 data Array Float64 length d l
  • 使用 Pkg.add 时出现 julia 错误

    我刚刚在ubuntu中安装了julia 在添加包时发现了一些问题 julia gt Pkg Add Gadfly ERROR UndefVarError Add not defined 我也尝试更新 julia 但弹出错误 julia gt
  • 如何在 Julia 中转置字符串数组?

    它适用于数字 但不适用于字符串 The 1 2 有效 但是 a b 没有 为什么 以及如何做到这一点 Why a b 不起作用 因为 运算符实际上计算矩阵的 惰性 伴随 请注意 如文档中所述 adjoint https docs julia

随机推荐

  • 如何让我的动画更加流畅 Android

    我有一个应用程序 有一个球在屏幕上运行 当球到达一半时 应用程序会记录一些音频 计算 FFT 并进行一些额外的分析 这是由 Asynctask 处理的 但是动画仍然短暂地卡顿 有人对如何使其运行更流畅有任何建议吗 Thanks 代码如下 i
  • Protractor - 在启动我的测试规范之前执行登录脚本

    这里的基本问题是我最初尝试登录 启动我的应用程序 然后运行所有规范 事实证明NOT是一个好方法 我无法弄清楚的是 Why navpanel spec js下面首先运行 在登录和启动 js 文件之前 换句话说 如果我在 navpanel sp
  • 有没有办法在android平台上自动播放视频?

    我读了数十亿个关于堆栈溢出的论坛和帖子 但什么也没有 当我找到解决方案或类似的东西时 就不再工作了 我尝试使用 Google API 但什么也没有 我可以在 IOS 本机播放器中自动播放视频 将直接 mp4 链接放在标签 上 但在 Andr
  • 如何使用JavaScript控制音频元素

    首先 我尝试不使用默认的 html5 标准控件 如果可能的话我很乐意使用 jQuery 但我暂时将其删除 因为我不确定问题是什么 目前我只是想有一个播放按钮 单击后会播放一 些音乐 该按钮将更改为暂停按钮 一旦点击这个暂停按钮 音乐就会明显
  • BottomNavigationView 不存在

    我正在尝试将 navigationeditor 与底部导航视图一起使用 但似乎底部导航视图只是导致问题的原因 这是我的 xml
  • 将平面数组中的每个字符串复制 N 次

    我想将每个值重复 3 次并按正确的顺序排列 应使用其自身的 3 个副本来代替每个原始元素 给定以下一维字符串数组 chars a b c 所以结果是 duplicatedChars a a a b b b c c c 我尝试过与str re
  • Gradle 如何从 apk 中排除文件

    我将密钥库存储在资产目录中 如何在构建中排除它以创建 apk 我以这种方式尝试过 但仍然存在 android packagingOptions exclude META INF LICENSE txt exclude assets keys
  • 如何向 EF Core 中的所有实体添加相同的列?

    想象一下 我想向我的所有实体添加 IsDeleted 列或一些审核列 我可以创建一个基类 我的所有实体都将继承该基类 这将解决我的问题 但是我无法指定创建列的顺序 因此我最终会在实体的字段之前得到所有审核字段 这是我不想要的 我希望他们位于
  • 程序最小化后无法从任务栏检索

    我将提供一些关于我正在尝试做的事情的背景 我创建了一个自定义按钮 该按钮应该通过淡出动画最小化我的窗口 因此它的代码如下 private void minimize Window object sender EventArgs e var
  • 同一变量“args”有两个不同的值

    我正在从 python 脚本调用一个方法 其中一个变量作为 args 一旦我进入该方法 当我尝试查看变量 args 的值时 print args 并且仅执行 args 会显示两个不同的值 谁能告诉我这两个命令有什么区别 我希望这两个命令显示
  • javascript大整数舍入是因为精度? (为什么?)

    如果你这样做 for var i 0 i lt 30 i console log i 78764357878563800 console log 78764357878563790 i 78764357878563800 您开始比较从 78
  • GNU make 似乎忽略了中间文件的非终端匹配规则

    我的目录中有以下文件 FP01 c include
  • 禁用有关在派生类的复制构造函数内显式初始化基构造函数的警告

    我正在使用启用了 Wextra 的 g 版本 4 2 1 我包含来自库的标头 并且不断收到有关库中某个类的以下警告 该警告由 Wextra 启用 我已将类的实际名称替换为 BaseClass warning base class class
  • 找到 setTimeout() 中剩余的时间?

    我正在编写一些与我不拥有的库代码交互的Javascript 并且无法 合理地 更改 它创建 Javascript 超时 用于显示一系列限时问题中的下一个问题 这不是真正的代码 因为它被完全混淆了 这是图书馆正在做的事情 setup a ti
  • 帮助推文媒体实体

    我刚刚发现推文实体 我想将其添加到我的推文中 我已经读了一遍又一遍的API 但我仍然无法让它工作 这就是我所拥有的 entities array media url gt picture url url gt short url type
  • g++:如何整理导出的符号

    我正在尝试编译一个使用 JNI 的 Java 库 当我启动程序时 我看到崩溃并出现 UnsatisfiedLinkError 它表示在 DLL 中找不到特定方法 经过仔细检查 我发现我用于编译和链接的 g 通过在方法名称中添加 8 或 16
  • 分配的指针字段变为

    我有一个结构 type user struct Id string data ptr userData 我在全局范围内存储用户的一部分 type Hall struct users user var hall Hall global 最后
  • 使用 AVX2 向量化随机初始化并使用十进制数字数组打印 BigInt?

    如何将我的代码传递给 AVX2 代码并获得与以前相同的结果 是否可以使用 m256i在 LongNumInit 中 LongNumPrint 函数代替uint8 t L 或某种类似类型的变量 我对 AVX 的了解相当有限 我调查了很多 但是
  • 当我写入超出数组末尾时,为什么不会出现分段错误?

    为什么我编译时没有给出错误 include
  • 朱莉娅,加速评估

    Julia 有一个非常好的功能 可以访问自己的语法树 这使得以编程方式生成新函数变得很容易 但它比普通的 Julia 代码慢得多 例如 julia gt timing time for i in 1 100 tan pi 2 rand en