鱼C论坛

 找回密码
 立即注册
查看: 4188|回复: 18

关于jit方法到底如何提升python速度的疑问

[复制链接]
发表于 2019-6-3 16:59:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
论坛之前有位大神,发过一个帖子,只增加一行代码,就可以提升python的百倍运行速度。。
我也试了他的例子,的确可以快速提升。
但是奇怪的是,我应用到自己的代码上时,却会报错,说语法错误。。
搞不懂是什么原因。。求解答。。
084908m6665h6ssi5m56ms.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-6-3 17:16:12 From FishC Mobile | 显示全部楼层
不知道为啥,你一边要使用python
另一边还要它给你提速,这不矛盾吗

虽然那个jit我是没用过,不过一个解释型语言
速度就是它的短板
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-3 17:20:03 | 显示全部楼层
wp231957 发表于 2019-6-3 17:16
不知道为啥,你一边要使用python
另一边还要它给你提速,这不矛盾吗

我有点钻牛角尖了。。
只是我个人在练习的过程中,希望利用python达到他的速度极限。。
其他语言,我也不会。。
我也想向机器学习方向发展,因此考虑侧重学习python。。同时,本身精力有限,还是需要先把一门语言学精了,再去学其他语言。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-3 17:53:26 | 显示全部楼层
你这个有点问题,装饰器使用来修饰函数的,@jit应该放在函数方法的前面。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-3 17:54:16 | 显示全部楼层
装饰器的作用:
    在不修改核心功能函数的前提下,为核心功能函数增加额外的功能
装饰器要求接受一个callable对象,并返回一个callable对象
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-3 18:50:42 | 显示全部楼层
2012277033 发表于 2019-6-3 17:53
你这个有点问题,装饰器使用来修饰函数的,@jit应该放在函数方法的前面。


我做了两种。。一个是放在整段代码前面。。直接报错。
第二种就是放在自定义的函数前面(最左侧的图片)。。但是貌似也是一样,不能使用啊。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-3 19:48:21 From FishC Mobile | 显示全部楼层
你还是换解释器吧,pypy就是jit编译,但是对c语言写的第三方库不如cpython支持的好
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-3 19:51:50 From FishC Mobile | 显示全部楼层
你是在做数据分析吧,又不是做web后端(需要考虑高并发),一味地追求速度没有意义
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-4 08:13:01 | 显示全部楼层
幽梦三影 发表于 2019-6-3 19:51
你是在做数据分析吧,又不是做web后端(需要考虑高并发),一味地追求速度没有意义

我也不是一味追求速度。。
只是在前期学习过程中,想多学些东西。
能快一点是一点。。
能不能解释下这个Jit到底该怎么用呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-27 15:18:25 | 显示全部楼层
jit限制太多了 , 具体原理也不是很懂 , 不过总结了两点 :
① jit装饰加速的函数中 不能有其他函数调用 包括python自带库 包括自己编写的函数等
② jit装饰加速的函数中 不能有任何外部文件的操作
如果需要加速的话 , 可以试试用 C 写运行时间长的部分 , 然后 python 将这部分拼接 . 听说 python 也有 C 的相关库可以使用 , 具体不是很清楚 .
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-27 15:19:13 | 显示全部楼层
害怕型全嘲豪 发表于 2019-6-27 15:18
jit限制太多了 , 具体原理也不是很懂 , 不过总结了两点 :
① jit装饰加速的函数中 不能有其他函数调用 包 ...

推荐使用 多进程 多线程 协程 的方式 加速运行.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-16 15:27:38 | 显示全部楼层
最近代码遇到瓶颈了想来看看有没有在使用NUMBA库的JIT修饰器的。好像鱼C这里没多少人在用。
说一下我的理解吧。我们平时用的python的话(系统XP.WINDOW之类的时候)写上代码运行出来都是读取一行运行一行,
在代码做计算的计算量不大或者是代码处理NUMPY数组量少的时候一般没什么问题,但是一旦
超过一定的量的时候就会卡在那里运行不出来了,(也不是说卡住了,你点关闭的时候他会显示在运行的
就是量太大他还没反应过来),这是因为XP,Window中的python使用的修饰器一般是自带的CPythonx修饰器。
这个cpython修饰器是对GIL进行了锁定的。而numba中的@jit修饰器就是对你的函数进行c编码(预编码),
相当于是绕过了那个锁定来运行代码.所以会感觉运行速度快几十上百倍。还有一点是。jit是对函数进行修饰。
每一个要jit的函数都要@jit修饰器。或者@jit(函数1,函数2,函数3。。。。)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-16 17:50:21 | 显示全部楼层
漫步云端〃 发表于 2019-9-16 15:27
最近代码遇到瓶颈了想来看看有没有在使用NUMBA库的JIT修饰器的。好像鱼C这里没多少人在用。
说一下我的理 ...

那是在定义函数前用@jit,还是调用函数前@jit呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-16 21:34:00 | 显示全部楼层
老笨啊 发表于 2019-9-16 17:50
那是在定义函数前用@jit,还是调用函数前@jit呢?

定义
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-16 21:34:32 | 显示全部楼层
wp231957 发表于 2019-6-3 17:16
不知道为啥,你一边要使用python
另一边还要它给你提速,这不矛盾吗

jit是将PYTHON翻译成机器代码的装饰器
怎么矛盾?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-19 08:59:48 | 显示全部楼层
老笨啊 发表于 2019-9-16 17:50
那是在定义函数前用@jit,还是调用函数前@jit呢?

我最近的尝试是这样的。1、@jit修饰器识别不了pandas的DataFrame数据类型,也就是说当你@jit紧接着定义函数的时候,在函数里的表达式中如果有对DF调用的相关内容都不会进行@jit修饰。2、@jit一般是用于处理大量的数据的,它比较擅长用于对科学实验的大量数据进行处理,你的代码中time()函数第一不是def的。第二也不是大量循环数据处理的。
11111111111111111分割11111111111111111111111
  1. from numba import jit
  2. import numpy as np

  3. x = np.arange(100).reshape(10, 10)

  4. @jit(nopython=True) # Set "nopython" mode for best performance, equivalent to @njit
  5. def go_fast(a): # Function is compiled to machine code when called the first time
  6.     trace = 0
  7.     for i in range(a.shape[0]):   # Numba likes loops
  8.         trace += np.tanh(a[i, i]) # Numba likes NumPy functions
  9.     return a + trace              # Numba likes NumPy broadcasting

  10. print(go_fast(x))
复制代码

222222222222222222222222分割22222222222222222222222
  1. from numba import jit
  2. import pandas as pd

  3. x = {'a': [1, 2, 3], 'b': [20, 30, 40]}

  4. @jit
  5. def use_pandas(a): # Function will not benefit from Numba jit
  6.     df = pd.DataFrame.from_dict(a) # Numba doesn't know about pd.DataFrame
  7.     df += 1                        # Numba doesn't understand what this is
  8.     return df.cov()                # or this!

  9. print(use_pandas(x))
复制代码

你可以对比一下包含不包含pandas.@jit作用于def之前,表示告诉你的编译器,可以从@jit的地方开始修饰。
还有一个注意事项,@jit有可选参数的参数nopython=True/False表示在使用@jit修饰器的时候需不需要python自带的修饰器。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-19 09:09:29 | 显示全部楼层
老笨啊 发表于 2019-9-16 17:50
那是在定义函数前用@jit,还是调用函数前@jit呢?

关于提高python运行速度这方面,最近查找了大量内容。网上推荐的内容有很多。1、精简代码。2、用矢量化代替FOR循环。3、用numba的@jit修饰器。4、用csv代替xls。5、Dask并行化进程。6、使用DF.apply.7、pandaralle库.8、........

个人感觉,第1、2、5条可以适用于大部分的编程场景。其他的都有很大的局限性。所以最近在研究Dask并行化进程方面的内容。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-19 09:13:09 | 显示全部楼层
永恒的蓝色梦想 发表于 2019-9-16 21:34
jit是将PYTHON翻译成机器代码的装饰器
怎么矛盾?

没毛病,说矛盾的人肯定是被某第一次实验的时候吓到了,@jit有一个情况是,在有某一次处理大量数据的时候会显得很慢,那是在处理数据成机器语言,但是当第二次到第N次的时候,这个过程可以提高几十上百倍,因为@jit修饰过的数据下一次再调用的时候不会再一次修饰处理,会直接从之前处理过的缓存中直接调用。所以速度会变很快。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-20 08:12:36 | 显示全部楼层
漫步云端〃 发表于 2019-9-19 09:09
关于提高python运行速度这方面,最近查找了大量内容。网上推荐的内容有很多。1、精简代码。2、用矢量化代 ...

df的apply貌似速度也不会快吧? 有人说和for循环差不多。。我试了下,感觉速度并不会很快。。没去计算时间去和for语句对比。。
关于矢量化,感觉就是并行计算的优点体现。。
具体不懂·~~本身就是一只小白
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-16 09:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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