为什么我的 Julia 代码运行得这么慢?

2023-12-01

redim = 2;
# Loading data
iris_data = readdlm("iris_data.csv");
iris_target = readdlm("iris_target.csv");

# Center data
iris_data = broadcast(-, iris_data, mean(iris_data, 1));
n_data, n_dim = size(iris_data);

Sw = zeros(n_dim, n_dim);
Sb = zeros(n_dim, n_dim);

C = cov(iris_data);


classes = unique(iris_target);

for i=1:length(classes)
    index = find(x -> x==classes[i], iris_target);
    d = iris_data[index,:];
    classcov = cov(d);
    Sw += length(index) / n_data .* classcov;
end
Sb = C - Sw;

evals, evecs = eig(Sw, Sb);
w = evecs[:,1:redim];
new_data = iris_data * w;

该代码只是对 iris_data 进行 LDA(线性判别分析)。 将 iris_data 的维度减少到 2。 大约需要 4 秒,但 Python(numpy/scipy) 只需要大约 0.6 秒。 为什么?


这是引言中第一页第二段的内容朱莉娅手册:

由于 Julia 的编译器与 Python 或 R 等语言使用的解释器不同,因此您一开始可能会发现 Julia 的性能并不直观。如果您发现某些事情很慢,我们强烈建议您仔细阅读性能技巧尝试其他任何操作之前的部分。一旦您了解了 Julia 的工作原理,就可以轻松编写几乎与 C 一样快的代码。


Excerpt:

避免全局变量

全局变量的值可能会随时发生变化,因此其类型也可能会发生变化。这使得编译器很难使用全局变量来优化代码。变量应该是本地的,或者尽可能作为参数传递给函数。

任何对性能至关重要或正在进行基准测试的代码都应该位于函数内。

我们发现全局名称通常是常量,这样声明它们可以极大地提高性能


知道script(所有程序顶级代码)风格在许多科学计算用户中非常普遍,我建议您至少将整个文件包装在一个let初学者的表达式(让我们引入一个新的本地范围),即:

let

redim = 2
# Loading data
iris_data = readdlm("iris_data.csv")
iris_target = readdlm("iris_target.csv")

# Center data
iris_data = broadcast(-, iris_data, mean(iris_data, 1))
n_data, n_dim = size(iris_data)

Sw = zeros(n_dim, n_dim)
Sb = zeros(n_dim, n_dim)

C = cov(iris_data)


classes = unique(iris_target)

for i=1:length(classes)
    index = find(x -> x==classes[i], iris_target)
    d = iris_data[index,:]
    classcov = cov(d)
    Sw += length(index) / n_data .* classcov
end
Sb = C - Sw

evals, evecs = eig(Sw, Sb)
w = evecs[:,1:redim]
new_data = iris_data * w

end

但我也强烈建议您将其重构为小函数,然后编写一个main调用其余部分的函数,类似这样,请注意此重构如何使您的代码通用且可重用(并且快速):

module LinearDiscriminantAnalysis

export load_data, center_data

"Returns data and target Matrices."
load_data(data_path, target_path) = (readdlm(data_path), readdlm(target_path))

function center_data(data, target)
    data = broadcast(-, data, mean(data, 1))
    n_data, n_dim = size(data)
    Sw = zeros(n_dim, n_dim)
    Sb = zeros(n_dim, n_dim)
    C = cov(data)
    classes = unique(target)
    for i=1:length(classes)
        index = find(x -> x==classes[i], target)
        d = data[index,:]
        classcov = cov(d)
        Sw += length(index) / n_data .* classcov
    end
    Sb = C - Sw
    evals, evecs = eig(Sw, Sb)
    redim = 2
    w = evecs[:,1:redim]
    return data * w
end

end

using LinearDiscriminantAnalysis

function main()
    iris_data, iris_target = load_data("iris_data.csv", "iris_target.csv")
    result = center_data(iris_data, iris_target)
    @show result
end

main()

Notes:

  • 您不需要所有这些分号。
  • 匿名函数目前速度很慢,但在 v0.5 中将会改变。您可以使用快速匿名现在,如果性能至关重要的话。
  • 总之,仔细阅读并考虑all性能提示。
  • main只是一个名称,可以是您喜欢的任何其他名称。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的 Julia 代码运行得这么慢? 的相关文章

  • 纹理大小的限制?安卓 Open GL ES 2.0

    我想知道可用于任何 Android Opengl Es 2 0 项目的纹理大小是否有任何限制 据我所知 尺寸为 4096x4096 的巨大纹理意义不大 因为它是在小屏幕上渲染的 但是 如果要求是在运行时在许多纹理之间切换怎么办 如果我想要一
  • 如何使我的网站获得更好的性能

    嘿那里 我在 Windows 2008 服务器上运行 IIS7 在高峰时段 我们有以下行为 CPU负载接近空闲 请求排队 使用资源监视器进行监控 执行时间超过10秒 1 4 请参阅以前的版本和编辑 5 异步做事 按照建议 我创建了一个简单的
  • 回显内容有时需要很长时间

    我有一个脚本 可以用一个字符串 content 构建我的网页 然后将其回显给用户 我的脚本如下所示 time1 microtime true content create content content time microtime tru
  • 当数据大小超过 500 万时,在 mongoDb 中从 java 调用 find() 查询会变慢

    我的应用程序在从 java 的 mongoDb 中执行 find 操作时遇到性能问题 当数据大小超过 500 万时 需要花费大量时间 有时搜索单个文档需要数千毫秒 任何意见都将受到赞赏 java查找查询 db test find flag
  • sprintf 与 String.Format 的性能[重复]

    这个问题在这里已经有答案了 我正在比较 sprintf 用法的性能 并对我所看到的感到有点困扰 我测试了以下 4 个方法 将 ClassWithToString 的实例传递给每个方法 PrintInt 除外 它接收实际的整数值 type C
  • 如何使用带有 Scripts.Render 的 ASP MVC 4 捆绑包的脚本延迟属性

    我浏览了 Google 和 Stackoverflow 但没有找到答案 是否有任何内置方法可以使捆绑包按延迟执行 或者有人知道有人为此编写的扩展帮助器方法吗 尝试将 Web Optimization 升级到版本 1 1 0Codeplex
  • 在方法之间重用PreparedStatement?

    We all know https stackoverflow com questions 2467125 reusing a preparedstatement multiple times that https stackoverflo
  • 动态_cast的性能?

    在阅读问题之前 这个问题不是关于它有多大用处dynamic cast 这只是关于它的性能 我最近开发了一个设计 其中dynamic cast被大量使用 与同事讨论时 几乎每个人都这么说dynamic cast不应该使用 因为它的性能很差 这
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • Knex 与 PostgreSQL 选择查询在多个并行请求上性能极度下降

    In brief 我正在开发一个 梦想中的 游戏 我的后端堆栈是 Node js 和带有 Knex 的 PostgreSQL 9 6 我在这里保存所有玩家数据 我需要经常请求它 其中一个请求需要进行 10 个简单的选择来提取数据 这就是问题
  • 需要访问tableView中的单元格:heightForRowAtIndexPath:

    我需要从以下位置访问表格中的单元格tableView heightForRowAtIndexPath 因为我想使用自定义单元格上的数据进行高度计算 我发现获取细胞的唯一方法是打电话tableView cellForRowAtIndexPat
  • 如何在 Julia 中实现迭代器?

    我正在尝试在 Julia 中实现迭代器 但是当 for 循环尝试调用时出现异常start已经 这是我得到的 我运行了 include 然后using RDF julia gt methods start 1 method for gener
  • Julia 中随机输出的数组理解

    如果我今天早些时候问过这个问题 那么这个问题是一个延伸 https stackoverflow com questions 44097910 killing a for loop in julia array comprehension 基
  • Java try/catch 性能,是否建议将 try 子句中的内容保持在最低限度?

    考虑到您有这样的代码 doSomething this method may throw a checked a exception do some assignements calculations doAnotherThing this
  • 并行执行按位运算的代码

    我有这段代码 通过将该 AU 矩阵的每个字节 8 个元素打包到 A 中来减少内存消耗 从而使 100k 200k 矩阵占用更少的空间 正如您所期望的 这段代码需要永远运行 我也计划将行数增加到 200k 我正在一个非常强大的实例 CPU 和
  • “内存泄漏”剖析

    从 NET 角度来看 什么是内存泄漏 https en wikipedia org wiki Memory leak 如何确定您的应用程序是否存在泄漏 有什么影响 如何防止内存泄漏 如果您的应用程序存在内存泄漏 当进程退出或被终止时它会消失
  • 在 R 中提取栅格的最快方法(提高我的可重现代码的时间)

    我想知道我是否已最大化提取栅格中某个点周围缓冲区域平均值的速度 本地的性能可以进一步提高吗 I use parallel mclapply已经 我知道我可以通过在集群上设置和运行它来获得进一步的收益 使用集群或获得更多的CPU不是我正在寻找
  • 由于表扫描,表值参数的性能较低

    我有一个将参数传递给 SQL 过程的应用程序 其中一个参数是表值参数 其中包含要包含在 where 子句中的项目 因为当我将 TVP 连接到具有 200 万行的表时 表值参数没有附加任何统计信息 所以查询速度非常慢 我还有什么选择 同样 目
  • Java线程创建开销

    传统观点告诉我们 大容量企业 Java 应用程序应该优先使用线程池 而不是生成新的工作线程 指某东西的用途java util concurrent使这变得简单 然而 确实存在线程池不适合的情况 我目前正在努力解决的具体例子是使用Inheri
  • 在 C# 中生成 Excel 列字母的最快函数

    接受 int 并返回包含一个或多个字母的字符串以便在 Excel 函数中使用的最快 C 函数是什么 例如 1 返回 A 26 返回 Z 27 返回 AA 等 这被调用了数万次 并且占用了生成包含许多公式的大型电子表格所需时间的 25 pub

随机推荐

  • 奇怪的wpf内存泄漏

    我遇到了一个奇怪的问题 即 wpf 中的 MenuItem 内存泄漏 我可以在 net 内存分析器中观察到此内存泄漏 我们的应用程序具有以下架构 一个主窗口 其中数据模板是一个 ApplicationPresenter Applicatio
  • 两个张量之间的克罗内克积

    我有两个张量 x 是 2 2 3 y 也是 2 2 3 定义张量的每个正面切片为x1 x2 x3 y1 y2 y3 xi 或 yi 是 2 2 矩阵 如何在matlab中计算x和y之间的克罗内克积 我想要得到的是 matlab 中的 kro
  • 我什么时候应该在 Asp.net MVC 中创建新的控制器类(设计问题)?

    在提问之前 先说一下我对MVC模式中Controller的理解 控制器是应用层 在DDD中 它控制应用程序流程 它保持薄 它控制工作单元 又名事务 我的问题是 我应该什么时候创建新的控制器类 我将举一个例子作为DinnerControlle
  • mongodb 在 python 中拒绝连接

    我在用windows8 为了编写我使用的代码IDLE 我尝试连接python to mongodb 但是当尝试获取集合名称时 会出现错误 ServerSelectionTimeoutError localhost 20101 Errno 1
  • Python 使用枚举内部列表理解

    假设我有一个这样的列表 mylist a b c d 为了将值与其索引一起打印 我可以使用 Pythonenumerate像这样的功能 gt gt gt for i j in enumerate mylist print i j 0 a 1
  • codeigniter 2 htaccess 路由差异

    28日发布的Codeigniter v2 0 我刚刚设置了全新安装并尝试从网址中删除index php 我使用相同的 apache 站点可用配置 htaccess 和 codeigniter 配置 当我排除index php时 Codeig
  • HTML 电子邮件 : td 左侧带有三角形

    而不是单独的td对于三角形 我想制作内容td with 左箭头三角形 就像图像中一样 table tr td width 2 align center valign middle style font family none font we
  • 如何使用 -ngraphic 和 -monitor 运行 qemu,但仍然能够向来宾发送 Ctrl+C 并使用 Ctrl+A X 退出?

    我刚刚发现如果你运行 QEMU monitor telnet 45454 server nowait nographic 然后 Ctrl C 终止 QEMU VM 而不是在来宾上生成 SIGINT 使用 ngraphic 运行 qemu 时
  • Scala 对 future 的“理解”

    我正在阅读 Scala Cookbook http shop oreilly com product 0636920026914 do 有一个与 Future 使用相关的示例 涉及理解 到目前为止 我对理解的理解是 当与集合一起使用时 它将
  • 在构造函数初始值设定项中复制初始化?

    为什么我的构造函数初始化程序不能使用复制初始化 struct S int a S int b a b direct initialization compiles struct T int a T int b a b copy initia
  • Django - 如何使用 LoginRequired 和 PermissionRequired 进行不同的重定向?

    我想创建一个 Mixin 它将 首先 检查用户是否经过身份验证 如果没有 则重定向到登录网址 如果是 第二 检查用户是否有定义的配置文件 用户 如果没有 则重定向到配置文件创建 否则 允许用户访问视图 我本来打算做类似的事情 class P
  • 如何打印计算机内存中的 long double 的二进制表示形式?

    我必须打印 a 的二进制表示long double由于某些原因的数量 我想查看计算机内存中保留的确切格式 我回答了以下问题union就是解决方案 为了float 替代数据类型是unsigned int因为两者都是 32 位的 为了doubl
  • 克隆存储库时出现 Gitlab/Gitolite 问题

    我严格按照Gitlab设置了来自 gitlab wiki 的手册 有用 我有网络访问权限 我也可以创建一个项目 并且在它之后创建了 git repo 一切都好 但是当我尝试克隆新创建的项目存储库时 git clone email prote
  • 忙碌指示器不显示

    我想展示一个BusyIndicator而一个漫长的过程正在进行中 问题是当我让它运行时它不会显示 并在该过程完成后显示 根据文档 繁忙指示器应用于指示正 在加载内容或 UI 被阻止等待资源可用时的活动 我创建了一个基于原始代码的最小代码 W
  • OAuth 同意屏幕为空白,并且加载图标在 Android 应用程序中永远旋转,

    我创建了一个 Android 应用程序 在其中访问谷歌日历 一周前它工作正常 但现在它没有显示 OAuth 同意屏幕 出现带有加载图标的白色弹出窗口 并且它不断旋转 看截图 OAuth 同意屏幕 我得到的错误是 com google api
  • 6.5.2.3 结构和联合成员中 C 中严格别名规则的例外

    引用自C99标准 6 5 2 3 5 为了简化联合的使用 做出了一项特殊保证 如果联合包含多个共享公共初始序列的结构 见下文 并且如果联合对象当前包含这些结构之一 允许在联合的完整类型声明可见的任何地方检查它们中任何一个的公共初始部分 如果
  • Git 分支没有按预期工作

    我正在阅读本教程 http gitref org branching 据我了解 本教程说如果我在Branch A并进行一些更改 不会影响其他分支 所以我正在测试这个 mkdir test cd test git init Initializ
  • 快速计算R中的二重积分

    我正在寻找比二重积分更快的解决方案 integrate function y sapply y function y integrate function x myfun x y llim ulim value llim ulim with
  • Boost::Asio :io_service.run() 与 poll() 或者如何在主循环中集成 boost::asio

    我目前第一次尝试使用 boost asio 进行一些简单的 tcp 网络 我已经遇到了一些我不太确定如何处理的事情 据我了解 io service run 方法基本上是一个循环 它运行直到没有什么可做的 这意味着它将运行直到我释放我的小服务
  • 为什么我的 Julia 代码运行得这么慢?

    redim 2 Loading data iris data readdlm iris data csv iris target readdlm iris target csv Center data iris data broadcast