今天,首席CTO指出,与您分享JIT可以更快地制作Python的多少。其中,它还将详细介绍它。如果您可以解决您现在面临的问题,请不要忘记注意此网站。让我们现在开始!
本文目录清单:
1.如何让Python与Julia 2. 2.如何查看Python的性能3.如何加速Python 4.知道哪种版本的Python是最快的5.每种语言的性能比较,为什么会有这么多Python差异很大。6。Python的表演Julia和Python
比较
我应该丢弃Python和其他语言,并使用Julia执行技术计算吗?在看到基准测试后,人们会这样想。
它远远落后于其他高级语言。但是,我想到的第一个问题与众不同:朱莉娅团队可以以最适合Python的方式编写Python基准测试吗?
我对此交叉语言比较的观点是根据要执行的任务来定义基准测试,然后编写语言专家实施这些任务的最佳代码。如果代码是由语言团队编写的,则没有其他语言中没有使用其他语言的风险。
朱莉娅(Julia)团队有一件事是正确的,也就是说,他们将使用的代码发布到github。特别是,可以在此处找到Python代码。
当您乍一看看到此代码时,您可以确认我害怕的偏见。该代码以C型式编写,并在数组和列表上使用了大量周期。这不是使用Python的最佳方法。
我不怪朱莉娅团队,因为我对自己的偏见感到内gui。但是我收到了一个残酷的教训:避免以任何价格避免阵列或清单的循环,因为他们确实会慢慢python
为了速度,请参见Python不是C。
考虑到C形式的这种偏见,一个有趣的问题(至少对我来说)是我们可以改善这些基准测试并更好地使用Python及其工具?
在给出答案之前,我想说我永远不会尝试降级朱莉娅。在进一步的发展和改进之后,朱莉娅无疑是一种值得关注的语言。我只想分析python
怎么了。实际上,我以此为借口来探索可用于更快运行代码的各种Python工具。
在以下内容中,我在jupyter笔记本中使用python 3.4.3和docker镜子。其中,所有Python科学工具组合都已安装。我将通过
python 2.7.10在Windows机器上,使用Anaconda运行代码。Time已执行到Python 3.4.3. NOTEBOOK包含以下所有以下基准测试,请参见此处。
鉴于各种社交媒体上的评论,我添加了这样的句子:我在这里没有使用Python的替代实现。我没有写任何C
代码:如果您不相信它,请尝试找到该细分市场。本文中使用的所有工具都是Anaconda或其他发行版提供的标准Cython实现。所有以下代码都在单个笔记本电脑中运行。
我试图使用GitHub使用Julia的Micro绩效文件,但是我不能使用Julia 0.4.2.我必须编辑它并替换@TimeIt for
@Time可以运行。在时间之前,我必须将呼叫添加到定时函数,否则将包含汇编时间。我使用的文件位于此处。我使用Julia命令行界面运行同一台计算机以运行同一机器运行Python。
背面
时间代码
朱莉娅团队使用的第一个基准测试是对斐波那契函数的简单编码。
def fib(n):
如果n2:
返回n
返回FIB(N-1)+FIB(N-2)
该功能的价值随着n的增加而迅速增加,例如:
fib(100)= 354224848179261915075
可以注意的是,python任意准确性很方便。在C和其他语言中写下相同的功能,需要进行一些编码工作以避免整数溢出。
在中国,您需要使用BigInt类型。
所有Julia基准测试都与运行时间有关。这是Julia中使用的时机,不使用BigInt:
0.000080秒(149个分配:10.167 KB)
0.012717秒(262.69 K分配:4.342 MB)
在Python笔记本中获得运行时间的一种方法是使用Magical%TimeIt。例如,在新单元中:
%timeit fib(20)
执行它将获得输出:
100循环,最佳3:3.33毫秒 /循环
这意味着计时器执行以下操作:
运行FIB(20)100次,存储总运行时间
运行FIB(20)100次,存储总运行时间
运行FIB(20)100次,存储总运行时间
从3个操作中获取最小运行时间,用100删除它,然后输出结果。结果是FIB的最佳运行时间(20)
这些循环的大小(100次和3次)将由计时器自动调整。循环大小可以根据计时代码的运行速度更改。
使用BigInt时,Python计时码表比Julia Chronograph好得多:3毫秒和12毫秒。当使用任何准确性时,Python的速度是Julia的4
笔记。
但是,Python比Julia的默认64 -bit Integer慢。LET可以看到如何强制Python中的64位整数。
背面
用Cython编译
汇编方法是使用Cython编译器。此编译器使用Python
书面。可以通过以下命令安装:
PIP安装Cython
如果您使用anaconda,则安装将有所不同。因为安装有点复杂,所以我写了一篇相关的博客文章:Windows上的Anaconda的安装Cython
安装后,我们使用Magical%load_ext将Cython加载到笔记本上:
%load_ext Cython
然后,您可以在我们笔记本中编译代码。我们只需要将我们要编译的代码放入一个单元中,包括所需的导入语句,然后使用Magical %% Cython来启动该单元:
%% Cython
def fib_cython(n):
如果n2:
返回n
返回fib_cython(n-1)+fib_cython(n-2)
执行此单元无缝编译此代码。我们对此功能使用略有不同的名称来反映其使用Cython
当然,整理。通常不需要这样做。我们可以用同名的编译功能替换先前的功能。
是时候得到它:
1000循环,最佳3:1.22毫秒 /循环
哇,几乎是原始Python代码快三倍!我们现在比使用Bigint的Julia快100倍。
我们还可以尝试静态类型。使用关键字CPDEF而不是DEF来声明函数。它使我们能够使用相应的C类型键入函数的参数。您的代码已成为:
%% Cython
cpdef long fib_cython_type(长n):
如果n2:
返回n
返回fib_cython_type(n-1)+fib_cython_type(n-2)
执行单元后,它将得到它:
10000循环,最佳3:36 μs每循环
太好了,我们现在只花费36微型,比最初的基准测试快100倍!这比朱莉娅花费的80毫秒要好。
有人可能会说静态类型违反了Python
从总体上讲,我同意这一说法,我们将研究一种避免这种情况而不牺牲绩效的方法。但是我认为这不是一个问题。fibonacci
必须使用整数来调用该函数。我们在静态类型中损失的是Python提供的任意精度。对于fibonacci,使用C型C型长。
输入参数的大小将受到限制,因为太大参数会导致整数溢出。
请注意,朱莉娅的计算也是使用64位整数执行的,因此我们的静态类型版本与朱莉娅的比较是公平的。
背面
缓存计算
我们可以在保留python的任何准确性的同时做得更好。FIB功能多次反复执行相同的计算。例如,FIB(20)将调用FIB(19)和
FIB(18).fib(19)将调用FIB(18)和FIB(17)。倒置FIB(18)被称为两次。简单分析表明,FIB(17)将被称为3
其次,FIB(16)将被称为5次,等等。
在Python 3中,我们可以使用Functools标准库来避免这些重复的计算。
从fuortools导入lru_cache作为缓存
@cache(maxsize = none)
def fib_cache(n):
如果n2:
返回n
返回fib_cache(n-1)+fib_cache(n-2)
将获得此功能:
1000000爱,最好的3:910 ns /循环
速度增长了40次,比原始Python代码快3,600倍!考虑到我们仅在递归功能中添加了注释,因此该结果非常令人难忘。
Python 2.7中未提供此自动缓存。我们需要明确表示代码,以避免在这种情况下重复计算。
def fib_seq(n):
如果n 2:
返回n
a,b = 1,0
对于我在范围(n-1)中:
a,b = a+b,a
返回
请注意,此代码具有同时分配两个本地变量的能力。
1000000循环,最佳3:1.77 μs每循环
我们快20倍!让我们不使用而不是静态类型来编译我们的功能。请注意,我们使用CDEF关键字来键入本地变量。
%% Cython
def fib_seq_cython(n):
如果n 2:
返回n
a,b = 1,0
对于我在范围(n-1)中:
a,b = a+b,a
返回
cpdef长fib_seq_cython_type(长n):
如果n 2:
返回n
cdef长A,b
a,b = 1,0
对于我在范围(n-1)中:
a,b = a+b,b
返回
我们可以在一个单元中使用两个版本:
%timeit fib_seq_cython(20)
%timeit fib_seq_cython_type(20)
结果是:
1000000爱,最好的3:953 ns /循环
10000000循环,最佳3:51.9 ns /循环
静态类型代码现在花费51.9 nan秒,比初始基准测试快60万(60,000)。
如果我们要在任何输入下计算斐波那契输入的数量,我们应该坚持使用非类型版本,运行速度更快3,500倍。不错,对吗?
背面
使用numba编译
让我们使用另一个名为numba的工具。这是一些Python版本的即时时间
(JIT)编译器。它不适用于所有Python版本,但在适用时会带来奇迹。
安装它可能很麻烦。建议使用安装numba的python发行版或docker镜像。安装完成后,我们导入其JIT编译器:
来自numba Import jit
它的使用非常简单。我们只需要对要编译的函数添加一些修改。我们的代码已成为:
@Jit
def fib_seq_numba(n):
如果n 2:
返回n
(a,b)=(1,0)
对于我在范围(n-1)中:
(a,b)=(a+b,a)
返回
是时候得到它:
1000000爱,最好的3:225 ns /循环
比非型Cython代码快的速度快,比原始Python代码快约16,000倍!
背面
使用numpy
让我们现在看一下第二个基准测试。这是快速排序算法的实现。朱莉娅团队使用了以下Python代码:
def qsort_kernel(a,lo,hi):
i = lo
j = hi
当我打招呼时:
pivot = a [(lo+hi)// 2]
而i = j:
而[i]枢轴:
i += 1
而[J]枢轴:
J- = 1
如果i = j:
a [i],a [j] = a [j],a [i]
i += 1
J- = 1
如果Lo J:
qsort_kernel(a,lo,j)
lo = i
j = hi
返回
我将他们的基准测试代码打包到一个函数中:
导入随机
DEF BENCHMARK_QSORT():
lst = [random.random()for in范围(1,5000)]
qsort_kernel(LST,0,Len(LST)-1)
是时候得到它:
100循环,最佳3:18.3 ms每循环
以上代码与C代码非常相似。Cython应该能够很好地处理。在使用Cython和静态类型的情况下,让我们使用Numpy
阵列替换列表。当数组很大时,例如数千个或更多元素,numpy数组确实比
Python列表更快。
安装numpy可能需要一些时间。建议使用Anoconda或Docker Mirror与Python Science工具的组合。
当使用Cython时,需要将Numpy导入到应用的单元格中。当使用C类型时,CIMPORT还必须以C模块为导入。
阵列使用代表数组元素类型的特殊语法和数组尺寸的数量(一个维度,两个维度等)。
%% Cython
导入numpy作为NP
cimport numpy为NP
cpdef np.ndarray [double,ndim = 1]
qsort_kernel_cython_numpy_type(np.ndarray [double,ndim = 1] a,
长LO,
长HI):
CDEF:
长I,J
双枢轴
i = lo
j = hi
当我打招呼时:
pivot = a [(lo+hi)// 2]
而i = j:
而[i]枢轴:
i += 1
而[J]枢轴:
J- = 1
如果i = j:
a [i],a [j] = a [j],a [i]
i += 1
J- = 1
如果Lo J:
qsort_kernel_cython_numpy_type(a,lo,j)
lo = i
j = hi
返回
cpdef Benchmark_qsort_numpy_cython():
lst = np.random.rand(5000)
qsort_kernel_cython_numpy_type(lst,0,len(lst)-1)
对于Benchmark_qsort_numpy_cython()函数,将获得:
1000循环,最佳3:1.32 ms每循环
我们比最初的基准测试快15倍,但这仍然不是使用Python的最佳方法。最好的方法是使用numpy build -in sort()
函数。默认行为是使用快速排序算法。该代码的时间:
DEF BENCHMARK_SORT_NUMPY():
lst = np.random.rand(5000)
NP.Sort(LST)
会得到:
1000循环,最佳3:350 μs每循环
现在,我们比最初的基准测试快52倍!朱莉娅在此基准测试中花费了419微秒,因此编译的Python几乎为20%。
我知道有些读者会说我不会进行类似的比较。- 功能。
Python的性能应在多个方面使用。如果您仅查看语言本身的标准版本,则可以说性能非常差,因为动态语言本身可以确定运行时检查了许多事情,并且标准版本没有厕所代码。JIT和其他优化是直接解释
但是,由于python的许多基本库是在C中实现的,因此,如果库的执行率很高,则速度仍然可以接受。典型的示例是python的高精确计算。根据28的法律
当然,您也可以直接将JIT解释器与PYPY一起使用,这也可以得到很多改进。尽管静态类型语言仍然存在差距
最后,解释说,效率问题反映了计算相对密度时的性能瓶颈。尽管某些网站似乎有大型业务,但业务本身可能并不十分复杂,而且访问的数量并不特别较高。这也可以估计估计它。
如何加速Python:
1.使用哈希表的数据结构
如果程序中遇到了大量的搜索操作,并且数据中没有重复的项目,则可以使用搜索而不是循环。
2.矢量化替换周期
尝试使用基于c的python库,例如numpy,scipy和pandas,并使用向量来处理程序中数组的多个元素的周期。
3.简化代码行的数量
编程时,尝试使用一些python构建的功能来简化代码行的数量。它简单明了,可以极大地提高代码操作效率。
4.使用多个过程
通常,计算机是多过程,因此您可以在执行操作时在Python中使用多局部。高,因此,如果您进行了大量的数据处理,则可以考虑使用多过程。
5.使用cpython
Cython是一个静态编译器,可以为您优化代码。加载CyphonMagic扩展名并使用Cython标记使用Cython来编译代码。
6.尝试使用CSV替换XLSX
处理数据时,我需要更长的时间来将数据加载到Excel文件或从Excel文件中保存数据。该路径我选择了创建多个CSV文件并创建一个文件夹以分组文件的路径。
7.使用numba
这是一个JIT(即时)编译器。通过装饰,Numba用Python和Numpy Code编译了评论,以将您的功能分为两个部分:
执行计算的功能 - 使用@AutoJit进行装饰
执行IO的功能
有关更多Python知识,请注意Python视频教程专栏。
哪个版本的python最快?当然,这取决于“需要根据不同条件进行测试的各种因素。
尽管PYPY是最快的,但不能被广泛使用。
PYPY具有瞬时(JIT)编译器,因此比Cpython.jit快得多
编译器有很大的好处,因为它们在执行可预测的重复任务时非常有效。
性能测试的特征之一是您需要多次运行相同的代码以使其准确,从而减少了应用程序的错误边界。因此,PYPY面对此类测试性能。
JIT编译器,尤其是PYPY JIT编译器的最重要的缺点是高启动成本。另一个缺点是许多C
langy语言扩展程序缺乏兼容性。因为“ Python”(Cpython,官方PSF Python)用C语言,PYPI编写
许多第三方对此进行了扩展。一个很好的例子。Numpy的大部分代码都用优化的C代码编写。执行PIP安装时
当Numpy命令时,它使用本地C编译器来构建二进制库,供您的Python用于Python程序。
由于pypy是用python编写的,因此许多模块根本无法使用pypy工作,因此您需要经常检查
Java的JIT已经优化了很多年,这比GO生成的本地程序更容易理解。为1亿个冒泡排序执行10升订单的数量,Java需要时间来接近GCC -O优化本地程序,尽管内存更大。
Node.js具有高效率和成熟的JIT编辑器。尽管它不如Java Hotspot Jit好,但很容易在几秒钟内轻松拥有没有JIT脚本的其他街道。
但是,Python的性能真的不好。总结需要1亿次。PHP7需要1.855秒,PHP5需要3.855秒,而Python2.7的时间为9.460秒,是PHP7的5倍。
我执行Python 23秒,PYPY执行1.54秒,NUMBA加速1.5秒,C语言在该机器的MACOS上执行1.3秒,Java运行1.45秒(JRE8)。查看图片详细信息。编译后,性能与C语言接近,并且写作Python比编写C要容易得多。它比Java更简单,并且编写代码的速度也非常重要。出于历史原因,许多Python库使用的C语言库,例如Pandas(Pandas的矩阵计算非常快地优化,可能比手写的C语言周期更快),您可以在C语言加速度通过设计分开后分离Python代码。加速方法(例如NUMBA)可以通过不同的加速方法加速功能,并将大量计算在功能中加速以加速使用NUMBA(Numbapro支持图形卡加速度,但商业版本)。
因此,只需正确设计即可。在一般计算问题下,在这些解决方案下,Python没有问题。这不可能。您还可以使用Boost :: Python编写C/C ++呼叫库来解决性能问题。
以下测试表明,对于性能,天然python相对较慢。Python比Linux快速,Windows下的MacOS。使用PYPY之后,它等效于Java,C#Speed,Pypy,C#在Windows中。性能相对稳定。C语言是最快的理论,但是它受环境和编译器的影响很大。对于C#,当GC垃圾回收回收时,Java可能会表现不稳定,因为在OOP中计算后可能会有大量的垃圾记忆对象。这不是在OOP中使用的,但纯粹是计算出来的。从理论上讲,C/C ++语言是最快的。
与Python和Java相比,跑步速度比Java慢。Java比改进n次的强大JRE强,但Python可以在许多领域称为许多Ready -Ready制作的开源库。它在数据分析中具有优势。Pyhton的代码比Java和EasyGetting启动和使用更简单。在优化计算库的帮助下,例如Numby Numba,Pandas,Scikit-Learn,Python的实际问题计算性能不低于Java。相对复杂。Java主要用于业务计划开发。它符合软件工程理论。它可以具有强大的可伸缩性。强大的类型有利于对程序进行静态检查和分析。随着Android,Hadoop,Spark的兴起,有许多公司加入Java语言,并且性能还可以通过优化来解决许多问题。默认值支持Python,并且需要安装和配置Java虚拟机。Python的安装和使用相对简单。Python的库有一种使用感。在许多业务领域,您仍然可以使用OOP编写代码,考虑设计模式,然后使用ho头挖沟。Python称挖掘机API。
结论:以上是首席执行官的全部内容,指出JIT可以更快地使Python。感谢您阅读本网站的内容。我希望这对您有帮助。关于Python可以使Python更快的更多信息。不要忘记在此网站上找到它。