python数学公式代码_代码详解:如何用Python运行高性能的数学范式?

本文探讨了Python中不同运行范式的性能表现,特别是在数据科学操作中的应用。通过比较纯Python迭代、迭代器、eval()、numpy矢量化和numexpr库的执行效率,展示了如何通过优化代码和选择正确库来提升数值计算的速度。实验结果显示,numexpr和numpy提供了显著的性能提升,特别是numexpr由于其内置的多线程支持,成为处理大规模数值计算的优选方案。
摘要由CSDN通过智能技术生成

全文共1140字,预计学习时长3分钟

u=341739562,3867656540&fm=173&app=49&f=JPEG?w=554&h=230&s=4BB580411A47695747BDD0C80300A091

u=3909404129,1600962818&fm=173&app=49&f=JPEG?w=640&h=70

比较python中不同运行范式的表现情况

对于任何以数据为中心的学科来讲,其主要任务之一是使科学计算和数值计算更较迅速。对于以性能为核心的应用程序和数据处理通道来讲,需要运行最佳范例并选择正确的库集。那么,在开发和学习中有哪些技巧呢?

首先需要明确的是:编写python代码和编写pythonic代码之间存在很大差异。

这篇文章围绕一些最常用的数据科学操作编写了最佳(也存在争议的)实践。例如通过使用numpy矢量化、并行计算和多线程来评估复杂的数学表达式,对ndarrays进行初始化。

u=3909404129,1600962818&fm=173&app=49&f=JPEG?w=640&h=70

定义数学表达的功能

处理大量数字是一项具有挑战性的任务,如果要对这些元素进行数值运算,结果就会完全改变。

假设有一个数学表达式要在具有100,000个数字的数组上进行评估:

y = |sin(x) + cos(x)|

使用范围函数创建数字列表:

n = 1000000

data_num = range(n)

让我们看看各种运行情况,最后会将所有使用timeit库的运行情况进行比较:

1.一种非常简单和直接的方法是遍历整个数据集,并将函数f(x)(上面定义)的输出附加到输出列表对象。

otpt = []

for x in data_list:

otpt.append(f(x))

2.我们可以使用这些迭代器:

return [f(x) for x in data_list]

3.使用python的eval()方法可以实现相同的目的:

exp = 'abs(cos(x) + sin(x)) ** 0.5'

return [eval(exp) for x in data_list]

4. 我们可以使用numpy vectorization tack实现相同的算法。

import numpy as np

data_np = np.arange(1000000)

def f4(data_np):

"""using the numpy vectorization

"""

return (np.abs(np.cos(data_np) + sin(data_np)) ** 0.5)

5.另一个专门用于评估这种数值表达式的库是numexpr。 这个库之所以变得非常便捷,是因为内置的多线程支持。

import numexpr as ne

ex = 'abs(cos(a) + sin(a)) ** 0.5'

ne.set_num_threads(5)

return ne.evaluate(ex)

我们列出了5种不同的范例来执行相同的操作。现在是时候检查它们是否产生了相同的输出。

将每个函数的输出记录为otpt1,otpt2等,以此类推。

我们可以使用numpy的allclose()方法来检查两个ndarray对象。

np.allclose(otpt1, otpt2)

np.allclose(otpt1, otpt3)

np.allclose(otpt1, otpt4)

np.allclose(otpt1, otpt5)

对于我们来说,他们应该都回归最重要的问题,这也是这篇文章的焦点:

与处理时间相比,每个范例是如何进行比较的。这个函数将帮助我们获得每个时间函数。

将所需参数传递给上述函数后,该函数使用timeit repeat来评估时间并对观察到的值进行排序。

function_list = ['f1', 'f2', 'f3', 'f4', 'f5']

data_com_list = ['data_num', 'data_num', 'data_num', 'data_np', 'data_np']

record_comp_time(function_list, data_com_list)

我们得到以下性能速度:

u=1262211933,1185227475&fm=173&app=49&f=JPEG?w=570&h=140&s=1AAA7C23CFE048030A54E1DA0100A0B1

从比较结果中可以清楚地看到,使用numexpr的函数在记录时间内产生输出,之后是使用numpy库的函数4。

下面是在Github上运行的链接,用于整个代码基础:

harshitcodes/python_paradigmsA guide to: How to compare different implementation paradigms in python? - harshitcodes/python_paradigms_github.com

u=953627512,1266177252&fm=173&app=49&f=JPEG?w=640&h=70

结论

对于任何数据密集型操作,python都有许多方法可以提高代码的性能。如果出现问题,以通过使用不同范例和选择正确的库来进行组合以实现最优性。除了范例之外,还有一些非常有用的库可以提高python代码的执行速度。

numexpr具有广泛的操作范围,这使得数值计算更加平稳和快速,下面其中一些操作。

Cython将Python的编写与C语言的速运行度相融合。Numba ,- 它动态地为CPU编译Python代码。Python内置模块multiprocessing能够进行并行处理。

u=1739615801,1194109226&fm=173&app=49&f=JPEG?w=640&h=71

留言 点赞 发个朋友圈

我们一起分享AI学习与发展的干货

编译组:草田

相关链接:

https://www.codementor.io/harshittyagi/high-performance-mathematical-paradigms-in-python-pjc5yocqm

如需转载,请后台留言,遵守转载规范

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值