我有一个用 Julia 编写的高性能函数,如何在 Python 中使用它?

I have a high-performant function written in Julia, how can I use it from Python?

我找到了一个 Julia 函数,它可以很好地完成我需要的工作。 我怎样才能快速集成它以便能够从 Python 调用它?

假设函数是

f(x,y) = 2x.+y

从 Python 开始使用它的最佳和最优雅的方法是什么?

假设您的 Python 和 Julia 已安装,您需要执行以下步骤。

  1. 运行 Julia 并安装 PyCall

    using Pkg
    pkg"add PyCall"
    
  2. 将您的代码放入 Julia 包中

    using Pkg
    Pkg.generate("MyPackage")
    

    在文件夹 src 中,您会找到 MyPackage.jl,将其编辑为如下所示:

    module MyPackage
    f(x,y) = 2x.+y
    export f
    end
    
  3. 安装 pyjulia

    python -m pip install julia
    

    (在 Linux 系统上,您可能希望使用 python3 而不是 python 命令)

    对于此步骤,请注意虽然外部 Python 可以与 Julia 一起使用。但是,为了方便起见,这可能是值得的 考虑使用与 Julia 一起安装的 Python 作为 PyCall。 在那种情况下,安装使用这样的命令:

    %HOMEPATH%\.julia\conda\python -m pip install julia
    

    或 Linux

    ~/.julia/conda/3/python -m pip install julia
    

    请注意,如果您定义了 JULIA_DEPOT_PATH 变量,您可以用它的值替换 %HOMEPATH%\.julia~/.julia/

  4. 运行 适当的 Python 并告诉它配置 Python-Julia 集成:

    import julia
    julia.install()
    
  5. 现在您可以调用您的 Julia 代码了:

    >>> from julia import Pkg
    >>> Pkg.activate(".\MyPackage") #use the correct path
        Activating environment at `MyPackage\Project.toml`
    >>> from julia import MyPackage
    >>> MyPackage.f([1,2],5)
        [7,9]
    

值得注意的是,与独立的 Julia 文件相比,此答案中提出的方法有几个优点,虽然不那么推荐,但这是可能的。优势包括:

  1. 包被预编译(因此它们在后续运行中更快)并且可以作为包加载到 Python。
  2. 软件包通过 1Project.toml` 带有自己的虚拟环境,这使得生产部署更加舒适。
  3. Julia 包可以静态编译到 Julia 的系统映像中,这样可以缩短其加载时间 --- 请参阅 https://github.com/JuliaLang/PackageCompiler.jl