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

Prz*_*fel 27 python python-3.x julia pycall

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

假设函数是

f(x,y) = 2x.+y
Run Code Online (Sandbox Code Playgroud)

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

Prz*_*fel 30

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

  1. 运行 Julia 并安装 PyCall

    using Pkg
    pkg"add PyCall"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将您的代码放入 Julia 包中

    using Pkg
    Pkg.generate("MyPackage")
    
    Run Code Online (Sandbox Code Playgroud)

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

    module MyPackage
    f(x,y) = 2x.+y
    export f
    end
    
    Run Code Online (Sandbox Code Playgroud)
  3. 安装pyjulia

    python -m pip install julia
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    %HOMEPATH%\.julia\conda\3\python -m pip install julia
    
    Run Code Online (Sandbox Code Playgroud)

    或在 Linux 上

    ~/.julia/conda/3/python -m pip install julia
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    using Pkg
    pkg"add PyCall"
    
    Run Code Online (Sandbox Code Playgroud)
  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]
    
    Run Code Online (Sandbox Code Playgroud)

值得注意的是,与独立的 Julia 文件相比,此答案中提出的方法有几个优点,尽管不太推荐。优点包括:

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

  • 是的!但是,我可以让“julia.install()”来完成它。当您从 Python 运行 `julia.install()` 时,它会检查 Julia `PyCall` 并根据需要安装或重建它。由于我喜欢自己安装 PyCall 而不是让别人安装,所以我添加了一个步骤。通过这种方式,您还可以选择使用与 PyCall 捆绑在一起的 Python,这基本上(至少对我来说)使用起来更舒服。与任何教程一样,这是主观的,但我编写它是因为我找不到我喜欢的 Python 到 Julia 教程。 (3认同)