找回密码
 立即注册
搜索
查看: 6626|回复: 25

[软件] Julia写着写着又写回Python了

[复制链接]
     
发表于 2024-2-23 21:33 来自手机 | 显示全部楼层 |阅读模式
MIT最近几年推Julia特别厉害
国内也有不少搞高性能计算的也吹julia
有Python的灵活,c的速度什么的
我在几个月前也还是julia忠实信徒

直到最近真拿julia做个课题
写着写着就又回到python了
然后这个课题就变成了一半julia一半python

所谓Python的灵活和c的速度严格来说不算错
但这两个很难同时达成

要么你灵活的写,那就肯定没有c的速度
你要有接近c的速度,那肯定就没有Python灵活

其实最大问题是julia主打的原生数组支持不如numpy灵活尤其数组嵌套和数组升维两个概念不同,导致操作数组很不顺

另一个问题是julia的速度来自于JIT
一个函数在一个session里第一次运行时被编译
所以除非你一个session里函数复用非常多,否则整体运行速度真没有优势
虽然julia原生支持多线程,但是多线程函数编译耗时更长,所以需要更多复用,节省下来的时间才能抵消jit编译的消耗

julia语法特别数理,倒是可以取代一些过去fortran的工作
回复

使用道具 举报

     
发表于 2024-2-23 21:55 | 显示全部楼层
现在不是有chatgpt大法么,我都是哪个语言现成的资源多用哪个了
回复

使用道具 举报

     
发表于 2024-2-23 22:02 来自手机 | 显示全部楼层
Julia可以直接暴露ast出来操作

第一次看到的时候惊呆了

不过,现在很多rust项目可以pyO3包裹成Python包来调用吸走了很多热度

—— 来自 Xiaomi Mi 10, Android 13上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

     
发表于 2024-2-23 23:02 | 显示全部楼层
早几年也试过julia,但不知是不是和Jupyter的交互有问题,每段代码都要编译好久,而且跑起来电脑卡卡的,后来就放弃了,不知道现在有没有改进
之前写计算的代码还是主要用Python,有些耗时比较长的核心求解部分用f2py处理。Fortran纯数值计算的部分写起来其实还挺爽的,数组切片向量化啥的支持都很好,就是和python之间的参数传递过于蛋疼。一直没搞明白怎么传object,只能传数值和array,复杂点的计算得几十个参数传进去,写得头皮发麻。另外就是在Fortran里调库也不如python方便,所以插值、解方程、求极值啥的都是用的自己手撸的简陋函数
最近又试了下PyO3,感觉运行速度和对python对象的支持都挺好,而且可以OOP了,Rust里搞个类把计算量大的方法都写好,然后Python里直接继承了再扩充点零碎代码,爽歪歪。Rust调库也方便多了,不过当前时间节点下Rust科学计算相关的库实在过于贫瘠,看Rust大佬们成天rewrite XX in Rust,也不知道什么时候能轮到科学计算这边

吐槽归吐槽,长远来说我还是比较看好PyO3这种方式的。至少在我接触到的科学计算相关内容里,除了真正耗时的核心求解部分之外,总是还有一堆非常琐碎的前后处理,而且和计算部分的耦合程度还挺高。这类东西用纯Python写跑得太慢,用纯C++、Rust之类写得头秃,所以类似Python+PyO3这样的模式就还比较舒服
回复

使用道具 举报

     
发表于 2024-2-23 23:56 | 显示全部楼层
现在是不是写java都快鄙视链底端了。我写啥都第一个想到java
回复

使用道具 举报

     
 楼主| 发表于 2024-2-24 01:18 来自手机 | 显示全部楼层
xmmc1800 发表于 2024-2-23 23:02
早几年也试过julia,但不知是不是和Jupyter的交互有问题,每段代码都要编译好久,而且跑起来电脑卡卡的,后 ...

rust原生的数组库还是不太能打
好用程度离fortran甚至numpy都有距离

—— 来自 vivo V2309A, Android 14上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

     
发表于 2024-2-24 09:13 来自手机 | 显示全部楼层
numpy配合些numba,并行化之类的加速手段也挺好用的,慢没所谓啦,半分钟出结果跟5分钟出结果也不是等不了
回复

使用道具 举报

发表于 2024-2-24 09:27 | 显示全部楼层
你提到的数组嵌套和升维是哪里有问题?
至于jit编译延时,最近的版本改善很多了,我建议是可复用的代码都抽象成package然后用precompile提速
回复

使用道具 举报

     
发表于 2024-2-24 09:36 | 显示全部楼层
来点实例,光听没 code 太玄虚

—— 来自 S1Fun
回复

使用道具 举报

     
发表于 2024-2-24 10:03 来自手机 | 显示全部楼层
本帖最后由 格林达姆 于 2024-2-24 10:04 编辑
lvcha3 发表于 2024-2-23 23:56
现在是不是写java都快鄙视链底端了。我写啥都第一个想到java

不是一个赛道的 java应该跟go cs这种比
回复

使用道具 举报

     
发表于 2024-2-24 12:47 来自手机 | 显示全部楼层
本帖最后由 JetBrains 于 2024-2-24 12:51 编辑
Saikou 发表于 2024-2-23 21:55
现在不是有chatgpt大法么,我都是哪个语言现成的资源多用哪个了

一个是导库,一个是写起来不一样

有些语言很多东西要手搓,Python 一下子就弄好了,另外就是像 C# Java 这种语言特性有Runtime所以有反射,别的最多编译层反

个人对编程语言的见解就是什么东西该用什么,而不是哪个好用
回复

使用道具 举报

头像被屏蔽
     
发表于 2024-2-24 16:52 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
 楼主| 发表于 2024-2-24 21:59 来自手机 | 显示全部楼层
本帖最后由 lactone 于 2024-2-24 22:05 编辑
anianime 发表于 2024-2-24 09:27
你提到的数组嵌套和升维是哪里有问题?
至于jit编译延时,最近的版本改善很多了,我建议是可复用的代码都抽 ...

julia原生的数组库里面

数组的数组和多维数组之间的转换很不方便

比如一个一维数组里的元素是一组等大的一维数组
类型依然是vector,这种情况下你给一个1索引,输出的是第一个数组
和二维数组matrix不一样,二维数组给一个1索引输出的是所有维度索引都是1的单一元素
要转换的话就要依靠stack或者cat

不像numpy,括号一框,直接升维

—— 来自 vivo V2309A, Android 14上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

发表于 2024-2-24 23:07 | 显示全部楼层
lactone 发表于 2024-2-24 21:59
julia原生的数组库里面

数组的数组和多维数组之间的转换很不方便

Nested array 和 multidimensional array 之间确实是有差异,我猜你是想Array([[1,2],[3,4]])这样直接生成2*2的矩阵?
回复

使用道具 举报

     
发表于 2024-2-24 23:30 | 显示全部楼层
平时工作上的一些小需求用GPT写个python实在太方便了,基本上稍微改一改就能用,有些甚至复制过来直接就能用
回复

使用道具 举报

     
 楼主| 发表于 2024-2-25 01:29 来自手机 | 显示全部楼层
anianime 发表于 2024-2-24 23:07
Nested array 和 multidimensional array 之间确实是有差异,我猜你是想Array([[1,2],[3,4]])这样直接生 ...

是的,numpy这样操作很方便

—— 来自 vivo V2309A, Android 14上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

     
发表于 2024-2-25 08:13 | 显示全部楼层
julia想吸引C和python用户就不该用F-major,老老实实当fortran和matlab升级版还是不错的
回复

使用道具 举报

发表于 2024-2-25 09:25 | 显示全部楼层
gpt把你的python和julia倒过来在倒过去根本毫无压力吧

语言什么以后只是装饰,写python的都能给你转成c++
回复

使用道具 举报

     
发表于 2024-2-25 16:32 | 显示全部楼层
语言只是工具
回复

使用道具 举报

     
发表于 2024-2-25 21:08 来自手机 | 显示全部楼层
其实也不是。比如多线程处理,python就不行,多进程写起来又特别麻烦。搞深度学习几乎默认绑定pytorch,其他语言就没那么方便。你要封装个dll,用c#就比java方便的多。
回复

使用道具 举报

     
发表于 2024-2-25 21:10 来自手机 | 显示全部楼层
普通小工具手头有啥用啥。我就python java。
回复

使用道具 举报

     
发表于 2024-2-25 21:38 来自手机 | 显示全部楼层
numpy性能很高的,还嫌性能低直接用torch在GPU上操作数组,应该没有比这个更快的了吧
回复

使用道具 举报

     
发表于 2024-2-26 03:08 来自手机 | 显示全部楼层
Saikou 发表于 2024-2-23 21:55
现在不是有chatgpt大法么,我都是哪个语言现成的资源多用哪个了

基础的力扣都写不好的玩意儿就别吹什么让程序员失业了,看得多了我都觉得尬

—— 来自 Xiaomi 23127PN0CC, Android 14上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

发表于 2024-2-26 06:50 来自手机 | 显示全部楼层
zyhang 发表于 2024-2-25 21:38
numpy性能很高的,还嫌性能低直接用torch在GPU上操作数组,应该没有比这个更快的了吧 ...

numpy的array element access速度不行,最近把一个cfd程序用c++重写以后快了140倍左右
回复

使用道具 举报

     
发表于 2024-2-26 12:44 来自手机 | 显示全部楼层
a9okalypse 发表于 2024-2-26 06:50
numpy的array element access速度不行,最近把一个cfd程序用c++重写以后快了140倍左右 ...

逐元素操作性能肯定不行吧,哪怕单线程c++也没快到哪里去。还是要想办法做成数组操作,或者写cuda
回复

使用道具 举报

发表于 2024-2-26 13:20 来自手机 | 显示全部楼层
zyhang 发表于 2024-2-26 12:44
逐元素操作性能肯定不行吧,哪怕单线程c++也没快到哪里去。还是要想办法做成数组操作,或者写cuda ...

就是完全一样的写法单线程c++比python快了140倍,应该加点parfor还能更快 但我是准备整个程序层面并行跑的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-11-30 20:07 , Processed in 0.222866 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表