Python与Julia结合使用的个人经验

  • 一、库的创建
    • 1.1. Python库的创建
    • 1.2. Julia包的创建
  • 二、库的调用
    • 2.1. Julia调用Julia包
    • 2.2. Python中调用Python库
    • 2.3. Julia调用Python库
    • 2.4. Python中调用Julia包
  • 三、Tips about VS Code

本人非专业程序员,下面讲的是我从事科学计算时得到的一点心得。
Julia速度很快,我随手写的Julia代码,常常比我精心用numba优化的Python代码快。但另一方面,Python确实令我难以割舍。一是Julia绘图国内教程较少,我看官方文档也画不出满意的图;二是Python的库确实很多,上至很多专业软件都出了相应的Python库,下至我们组内也流传着师兄写的伪彩图函数。
因此我还是希望Python继续发挥“胶水”的作用,来整合 自己写的Julia包以及其他程序结果。

一、库的创建

1.1. Python库的创建

暂略。搜__init__.py的用法。

1.2. Julia包的创建

关于包的创建,暂且先参考这个视频。
下次我再创建包的时候,可以来记录下我的简单流程。

第一步,我们需要Julia REPL,目录为你要放置包的目录。
比如我的包都放在

"D:\\Documents\\Julia\\MyModules"

中,我是windows平台,在这里shift+右键,选择“在此处打开Powershell窗口”,然后输入Julia启动REPL。这时默认就是上面的文件夹:

julia> pwd()
"D:\\Documents\\Julia\\MyModules"

(其实VSCode下面的窗口也可以)

第二步,按下]切换到包管理模式——我们要创建包,所以后面都是在包管理模式下。输入generate 包名。于是,在你当前文件夹下面会出现两个文件:

(@v1.6) pkg> generate 包名Generating  project 包名:包名\Project.toml包名\src/包名.jl

这里:

  • 包名一整个文件夹就是你的包;

    • 包目录下面src文件夹是代码文件存放处;

      • src下面的包名.jl则是和包同名的源文件。包的主体:module...end模块、using了哪些别人的包、export了哪些函数,就在这里。如果你有很多文件,可以用include("./XXX.jl")来包含。
    • 包目录下面Project.toml是程序员能看懂的环境管理信息。你的包如果调用别的包,在这里就能看到所依赖的版本。

第三步,切换到包目录,即Project.toml所在的目录。然后利用Project.toml的内容:

(@v1.6) pkg> activate .Activating environment at `D:\Documents\Julia\MyModules\包名\Project.toml`(包名) pkg>

激活当前文件夹所在的环境。注意pkg>前面会变成你的包名。

第四步

(包名) pkg> instantiateNo Changes to `D:\Documents\Julia\MyModules\包名\Project.toml`No Changes to `D:\Documents\Julia\MyModules\包名\Manifest.toml`

很明显,初始化一些东西。此时会额外在跟目录下生成Manifest.toml文件。它是机器看得懂的Project.toml。听说如果你调用别人的库,可以锁代码版本,我不会。后面你添加了别人的包,这里也会更新。这个貌似后面要经常更新。

第五步(其实可以穿插在编辑源码的过程中),添加一些包,

(包名) pkg> add 其它包名

二、库的调用

2.1. Julia调用Julia包

假设你已经创建了自己的程序库/包,可以研究下这段代码:

tryglobal computername = ENV["COMPUTERNAME"]     # windows电脑只有"COMPUTERNAME"
catchglobal computername = ENV["HOSTNAME"]    # Linux只有"HOSTNAME"
endif computername == "家里电脑"push!(LOAD_PATH, "E:/Documents/JuliaProgram/MyModules/")    # 只有一个平台的看这一行就好
elseif computername == "宿舍电脑"push!(LOAD_PATH, "F:/Documents/JuliaProgramme/MyModules")
elseif computername=="DESKTOP-FDIN0I7"push!(LOAD_PATH, "D:/Documents/Julia/MyModules")
end

上面之所以要global是因为Julia中文文档-变量作用域中有写,try...catch...end会引入局部的作用域(局部作用域是一个易错点):

  • 若之前computername已经定义,它会出现歧义警告,并在try内创建局部变量(注意:交互和非交互结果不同);
  • 若之前computername未定义,则只会在try内创建局部变量,用完就丢掉。为了防止变成全局变量,需要加上global来提示。

这段代码,总的来说实现了两个功能:

  1. 将你自己的包目录添加到搜索目录;
  2. 不同电脑/服务器可以运行同样的代码。第一行是为了获得电脑名;后面是为了针对不同的电脑/服务器(不同电脑可以用onedrive、坚果云、群晖等等同步同一个个人程序库),分别将你的包目录添加到LOAD_PATH,这样你using或者import的时候,Julia就会分情况添加你的库。

2.2. Python中调用Python库

import socket, sys
host_name = socket.gethostname()
if (host_name == 'localhost.localdomain'): sys.path.insert(0, '/home/XXX/MyFunction') # 导师工作站
if (host_name[0:6] == 'acc-ap'): sys.path.insert(0, '/sharefs/heps/user/XXX/MyFunction') # acc-apXX服务器
if (host_name == 'DESKTOP-FDIN0I7'): sys.path.insert(0, 'D:/Documents/PythonFiles/001.科研/000.Accelerator/MyFunctionForAccelerator') # 办公室电脑
if (host_name == '宿舍电脑'): sys.path.insert(0, r'F:/Documents/PythonProgramme/001.科研/000.Accelerator/MyFunctionForAccelerator') # 宿舍电脑
if (host_name == 'XXXXX'): sys.path.insert(0, r'D:/PythonFile/001.科研/000.Accelerator/MyFunctionForAccelerator') # Surface
if (host_name == '家里电脑'): sys.path.insert(0, r'E:/Documents/PythonProgramme/001.科研/000.Accelerator/MyFunctionForAccelerator') # 家里电脑

前两段是为了获得电脑/服务器名,剩下就是为了针对不同电脑,将各自的库文件夹添加到Python搜索的目录。

2.3. Julia调用Python库

需要安装PyCall这个Julia包。
请注意下面py前缀,这个在Julia中称为“宏”,类似Python中的“装饰器”。我的理解,它的作用就是:

  1. 打开python内核(如果这段程序前面没有打开的话);
  2. 提交后面紧接的文字给python内核——有点像你在python终端中打字给它;
  3. 等着新的指令——意味着后面可以接着前面继续执行。
using PyCallpy"""
import matplotlib.pyplot as plt
plt.style.use("science")
"""xdata = [0.0, 1, 2, 3, 4]
ydata = [4.0, 3, 2, 1, 0]py"""
def plot1(xdata, ydata, xlabel, ylabel):plt.figure(figsize=(3,3), dpi=200)plt.plot(xdata, ydata)plt.grid()plt.xlabel(xlabel)plt.ylabel(ylabel)plt.show()
"""py"plot1"(xdata, ydata, raw"$x$", raw"$y_1$") # 这里有传参的方法

可以看到我三次分别提交的py装饰的python程序片段,它都能正确执行。

2.4. Python中调用Julia包

需要安装Julia这个Python库。

from julia import Mainloadpath="""
tryglobal computername = ENV["COMPUTERNAME"]
catchglobal computername = ENV["HOSTNAME"]
endif computername == "家里电脑"push!(LOAD_PATH, "E:/Documents/JuliaProgram/MyModules/")
elseif computername == "宿舍电脑"push!(LOAD_PATH, "F:/Documents/JuliaProgramme/MyModules")
elseif computername=="DESKTOP-FDIN0I7"push!(LOAD_PATH, "D:/Documents/Julia/MyModules")
endusing DoubleRFs  # 导入自己写的包
"""
Main.eval(loadpath) # 这段就会启动Julia内核、执行上面的Julia代码,并等待着

Main.eval(s)的作用,类似于你在Julia终端输入了s这个字符串。终端会从你输入的这行字识别出你知道想干什么,并返回值。

x, y=Main.eval("DoubleRFs.getSynchrotronTunes(400, 3643872.777, 6e9, 1.560987361026252e-5, 2.0399026, -0.584545192849095, 0.1806991469840516, 756, 3, 1360.4)")

万幸Julia内核/终端会在后面等着你输入——我这里第二次提交Main.eval(),可以看到它接着第一次using DoubleRFs继续执行了。
这里x, y获得的结果是正常的(只不过数值类型从Julia中的Vector变成python中numpynumpy.ndarray了)。

plt.plot(x, y, ".")
plt.xlabel(r"$z$")
plt.ylabel(r"$\nu_s$")
plt.show()


三、Tips about VS Code

如果你用到VSCode,可以在打开.jl代码时,点开设置-用户代码片段-julia.json,添加如下片段:

{// Place your snippets for julia here. Each snippet is defined under a snippet name and has a prefix, body and // description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the // same ids are connected.// Example:// "Print to console": {//   "prefix": "log",//  "body": [//       "console.log('$1');",//         "$2"//    ],//    "description": "Log output to console"// }"My Julia Module":{"prefix": "MyModule","body": ["try","    global computername = ENV[\"COMPUTERNAME\"]","catch","    global computername = ENV[\"HOSTNAME\"]","end","if computername == \"家里电脑\"","    push!(LOAD_PATH, \"E:/Documents/JuliaProgram/MyModules/\")","elseif computername == \"宿舍电脑\"","    push!(LOAD_PATH, \"F:/Documents/JuliaProgramme/MyModules\")","elseif computername==\"DESKTOP-FDIN0I7\"","    push!(LOAD_PATH, \"D:/Documents/Julia/MyModules\")","elseif computername==\"TINA\"","    push!(LOAD_PATH, \"D:/JuliaProgramme/MyModules\")","end",]}
}

以后在.jl(julia文件)中键入MyModule就会出来这一整个片段。
python类似,就是.py文件时,编辑python.json文件。

Python与Julia结合使用的个人经验相关推荐

  1. 在R、Python和Julia中常用的数据可视化技术

    俗话说"一图胜千言".通过各种图片和图形化展示,我们可以更清晰地表达很多抽象概念.理论.数据模式或某些想法.在本章中,我们首先解释为什么应该关心数据可视化.然后,我们将讨论几种在R ...

  2. Py之Matplotlib:python包之Matplotlib库图表绘制经验总结(中英文字体修改、横坐标文字进行横/纵向显示、控制坐标轴范围等)之详细攻略

    Py之Matplotlib:python包之Matplotlib库图表绘制经验总结(中英文字体修改.横坐标文字进行横/纵向显示.控制坐标轴范围等)之详细攻略 目录 1.Matplotlib库图表绘制包 ...

  3. Python:实现Julia集算法(附完整源码)

    Python:实现Julia集算法 import warnings from collections.abc import Callable from typing import Anyimport ...

  4. python编辑word与读Excel的经验

    python编辑word与读Excel的经验 前段时间为了解决工作上的一些问题,有听说python有相关的库编辑Office文档很方便,就被骗进坑了.为了避免后来者再遇到相同的坑,所以把这些经验写下来 ...

  5. julia python_如何让 Python 像 Julia 一样快地运行

    展开全部 Julia 与 Python 的比较 我是否应丢弃 Python 和其他语言,使用 Julia 执行技术计算?在看到 http://julialang.org/ 上的基准测试62616964 ...

  6. 再见, Python, 你好, Julia

    点击上方"Python高校",关注你的技术大学 来自:雷锋网公众号 随着 Python 的停滞不前,一个新的热门竞争对手出现了. 不要误解.Python 的受欢迎程度,仍然得到计算 ...

  7. 用python画蝴蝶_图形化编程经验分享,画笔基础,软件包括Python、Kittenblock

    跟很多学生聊过,很多学生不是不努力,只是找不到感觉.有一点不可否认,同样在一个教室上课,同样是一个老师讲授,学习效果迥然不同.关键的问题在于,带入感,我能给出的建议,就是咬咬牙,坚持住,没有学不会的知 ...

  8. loss下降auc下降_梯度下降算法 线性回归拟合(附Python/Matlab/Julia源代码)

    梯度下降 梯度下降法的原理 梯度下降法(gradient descent)是一种常用的一阶(first-order)优化方法,是求解无约束优化问题最简单.最经典的方法之一. 梯度下降最典型的例子就是从 ...

  9. 0基础成功转行Python自动化测试工程师,年薪30W+,经验总结都在这(建议收藏)

    两年前的决定我觉得还是非常正确的,就是自学了python,然后学习了自动化测试.性能测试.框架.持续集成,同时也把前面的软件测试基础知识全部补全了.目前的收入还比较满意,月入2W+(仅代表个人收入), ...

  10. 如何免费学习Python?分享我自己的学习经验

    大家好,这里是法学院毕业的Python程序员晚枫.,今天讲点可能会得罪人的东西. 最近Python这个语言非常热门.我本身就是做Python开发的,Python能不能免费学呢?实际上完全没有问题. 今 ...

最新文章

  1. linux makefile 宏定义
  2. MySQL Commons
  3. windows系统中eclipse C开发环境的架设
  4. 一个简单的空气质量数据监测站项目
  5. BetterZip使用教程分享:Mac用户如何提取压缩文件?
  6. 三星电视与计算机连接网络设置,三星电视怎么连接网络看电视?
  7. Linq 使用skip和take分页
  8. sql server 锁定_如何使用SQL Server 2014托管锁定优先级控制在线索引重建锁定
  9. Java设计模式之单例(Singleton)模式解析
  10. 工业机器人演示码垛和卸垛_「成果播报」流水线上的“专家”——智能拆垛装车机器人系统...
  11. 计算机无法识别新u盘,电脑新装win7系统就无法识别u盘怎么办
  12. java.lang.IllegalStateException: Current state = FLUSHED, new state = CODING_END问题查找
  13. 5步教你成功求职进入BAT
  14. error:‘%include‘ expects a file name
  15. 环境搭建--谷粒商城笔记一
  16. linux 锁定用户目录,Linux vfpd锁定用户目录
  17. python根据视频帧按秒从视频中提取图片
  18. 数据库mysql表常见字段大小_常用的数据库的字段类型及大小
  19. 收费企业邮箱与收费个人邮箱区别,你造吗?
  20. Activity传递数据四种方法

热门文章

  1. 这才叫高颜值的Markdown编辑神器!
  2. 无线控制需要服务器,无线局域网无线控制器管理用户通过RADIUS服务器认证的配置-Cisco.PDF...
  3. openstack controller ha测试环境搭建记录(二)——配置corosync和pacemaker
  4. Grid-based RRP/基于网格的路径重新规划问题
  5. 编程,初来乍到,多多关照。
  6. html设置文字超过字数_CSS限制字数,超出部份显示点点点...
  7. 攻防世界---mfw
  8. e 服务器怎么注册不了怎么办,IMVU注册不了怎么办 服务器错误怎么办
  9. DAOS 系统内部介绍(一)—— 概述
  10. iTest使用说明_V4.5.1