当前位置: 首页 > 网络应用技术

包括JIT的条目,可以使Python更快

时间:2023-03-07 02:33:43 网络应用技术

  今天,首席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更快的更多信息。不要忘记在此网站上找到它。