蚊章汇 - Julia
type: channel
link: https://linuxcn.bwsl.wang/tag/Julia/
items: Julia 和 Python，哪一个更快？

Julia 和 Python，哪一个更快？
type: item
date: 2022-10-02T20:25:45+08:00
description: Julia 是一门高度抽象的动态编程语言。虽然它是一门能够开发所有程序的通用语言，但它有几个特点，非常适用于科学计算和数值计算。Python 在 1990 年初作为一种简单的面向对象的程序语言出现，如今已经有了显著的发展。本文将从它们在神经网络和机器学习的性能表现上进行讨论。Julia 的架构以动态语言中的 参数多态性 parametric polymorphism 和 多重派发 multiple dispatch 的编程范式为主要特色。它允许使用或不使用 消息传递接口 message passing interface （MPI）或内置的 “OpenMP 式” 线程进行并发、并行和分布式计算，以及直接调用 C 和 FORTRAN 库而无需额外的代码。Julia 使用 即时 just-in-time （JIT）编译器，Julia 社区将其称为 “ 即时预编译 just-ahead-of-time （JAOT）”，因为它在运行之前默认将所有代码编译为机器码。与 Python 不同，Julia 是专为统计学和机器学习而设计的。Julia 可以快速的完成线性代数的运算，但 Python 很慢。这是因为 Python 从来都不是为了适应机器学习用到的矩阵和方程而设计的。Python 本身并不差，特别是 Numpy，但在没有使用包的情况下，Julia 更像是为数学量身定制的。相比 Python，Julia 的运算符更像 R，这是一个显著的优势。大部分的线性代数运算可以用更少的时间和精力去完成。众所周知，近年来 Python 在机器学习和数据科学领域占据主导地位。因为在 Python 中我们可以使用各种各样的第三方库来帮助我们编写机器学习的代码。虽然 Python 有这么多优势，但仍有一个主要的缺点——它是一门解释性语言，速度非常慢。现在是数据时代，数据越多我们处理它的时间就越长，这也是 Julia 出现的理由。到目前为止，有关 Julia 的研究工作都集中在高性能或者 Julia 的科学计算能力等主题上。但在这里，我们将讨论 Julia 不仅能够有效地处理复杂的科学计算，还能够处理基于商业的问题，以及像 Python 一样处理机器学习和神经网络。实验目标与实验设计Julia 像 Python 一样简洁，但却像 C 一样是一门编译语言。首先我们来测试 Julia 要比 Python 快多少。为此，我们先在一些简单的程序上测试它们，然后来到我们实验的重点，测试它们的机器学习和深度学习能力。Julia 和 Python 都提供了许多库和开源的基准测试工具。为了在 Julia 中进行基准测试和计算时间，我们使用了 CPUTime 和 time 库；对于 Python，我们同样使用了 time 模块。矩阵乘法一开始我们尝试了简单的算术运算，但由于这些运算不会产生太大的时间差异，我们决定比较矩阵乘法的时间差异。我们创建了两个 (10 * 10) 的随机浮点数矩阵，并对它们施以点积。众所周知，Python 有一个 Numpy 库，常被用于计算矩阵和向量。而 Julia 也有一个 LinearAlgebra 库，常用于计算矩阵和向量。因此我们分别比较了各自使用和不使用库的矩阵乘法的耗时。本文用到的所有源码已经放在了 GitHub 存储库。下面给出了用 Julia 编写的 10×10 矩阵乘法程序：@time LinearAlgebra.mul!(c,x,y) function MM() x = rand(Float64,(10,10)) y = rand(Float64,(10,10)) c = zeros(10,10) for i in range(1,10) for j in range(1,10) for k in range(1,10) c[i,j] += x[i,k]*y[k,j] end end end end @time MM 0.000001 seconds MM (generic function with 1 method) Julia 使用库耗时 0.000017 秒，使用循环耗时 0.000001 秒。使用 Python 编写相同的矩阵乘法程序如下。 从结果可以发现，与不使用库相比，使用库的程序花费的时间更少：import numpy as np import time as t x = np.random.rand(10,10) y = np.random.rand(10,10) start = t.time() z = np.dot(x, y) print(“Time = “,t.time()-start) Time = 0.001316070556640625 import random import time as t …