性能追求第二部分:Perl 与 Python

性能追求第二部分:perl 与 python

运行了一个玩具性能示例后,我们现在将稍微偏离主题并将性能与
进行对比一些 python 实现。首先让我们设置计算阶段,并提供命令行
python 脚本的功能。

import argparseimport timeimport mathimport numpy as npimport osfrom numba import njitfrom joblib import parallel, delayedparser = argparse.argumentparser()parser.add_argument("--workers", type=int, default=8)parser.add_argument("--arraysize", type=int, default=100_000_000)args = parser.parse_args()# set the number of threads to 1 for different librariesprint("=" * 80)print(    f"nstarting the benchmark for {args.arraysize} elements "    f"using {args.workers} threads/workersn")# generate the data structures for the benchmarkarray0 = [np.random.rand() for _ in range(args.arraysize)]array1 = array0.copy()array2 = array0.copy()array_in_np = np.array(array1)array_in_np_copy = array_in_np.copy()

这是我们的参赛者:

基础python

  for i in range(len(array0)):    array0[i] = math.cos(math.sin(math.sqrt(array0[i])))

numpy(单线程)

np.sqrt(array_in_np, out=array_in_np)np.sin(array_in_np, out=array_in_np)np.cos(array_in_np, out=array_in_np)

joblib(请注意,这个示例不是真正的就地示例,但我无法使用 out 参数使其运行)

def compute_inplace_with_joblib(chunk):    return np.cos(np.sin(np.sqrt(chunk))) #parallel function for joblibchunks = np.array_split(array1, args.workers)  # split the array into chunksnumresults = parallel(n_jobs=args.workers)(        delayed(compute_inplace_with_joblib)(chunk) for chunk in chunks    )# process each chunk in a separate threadarray1 = np.concatenate(numresults)  # concatenate the results

努巴

@njitdef compute_inplace_with_numba(array):    np.sqrt(array,array)    np.sin(array,array)    np.cos(array,array)    ## njit will compile this function to machine codecompute_inplace_with_numba(array_in_np_copy)

这是计时结果:

in place in (  base python): 11.42 secondsin place in (python joblib): 4.59 secondsin place in ( python numba): 2.62 secondsin place in ( python numpy): 0.92 seconds

numba 出奇的慢!?难道是由于 mohawk2 在 irc 交流中关于此问题指出的编译开销造成的吗?
为了测试这一点,我们应该在执行基准测试之前调用compute_inplace_with_numba一次。这样做表明 numba 现在比 numpy 更快。

in place in (  base python): 11.89 secondsin place in (python joblib): 4.42 secondsin place in ( python numpy): 0.93 secondsin place in ( python numba): 0.49 seconds

最后,我决定在同一个例子中使用 base r 来骑行:

n<-50000000x<-runif(n)start_time <- sys.time()result <- cos(sin(sqrt(x)))end_time <- sys.time()# calculate the time takentime_taken <- end_time - start_time# print the time takenprint(sprintf("time in base r: %.2f seconds", time_taken))

产生以下计时结果:

Time in base R: 1.30 seconds

与 perl 结果相比,我们注意到此示例的以下内容:

基础 python 中的就地操作比 perl 慢约 3.5 单线程 pdl 和 numpy 给出了几乎相同的结果,紧随其后的是基础 r未能考虑 numba 的编译开销会产生 错误 的印象,即它比 numpy 慢。考虑到编译开销,numba 比 numpy 快 2 倍joblib 的并行化确实改进了基础 python,但仍然不如单线程 perl 实现多线程 pdl(和 openmp)碾压(不是崩溃!)所有语言中的所有其他实现。希望这个帖子提供了一些值得思考的东西用于下一次数据/计算密集型操作的语言。 本系列的下一部分将研究在 c 中使用数组的相同示例。最后一部分将(希望)提供有关内存局部性的影响以及使用动态类型语言所产生的开销的一些见解。

以上就是性能追求第二部分:Perl 与 Python的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1348448.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 12:02:58
下一篇 2025年12月8日 05:04:22

相关推荐

  • python如何计算销售额

    通过使用 Python 编程语言,您可以自动化电子商务销售额计算,获取准确的数据。导入库:import pandas as pd加载销售数据到 DataFrame 中。计算总销售额:使用 df.sum() 方法计算 DataFrame 中所有销售值的总和。按产品类别计算销售额:使用 df.group…

    2025年12月13日
    000
  • python如何定义一个函数?

    Python 函数的定义方法有三种:使用 def 关键字和函数参数定义。使用匿名 lambda 表达式在一行中定义。使用 functools.partial 函数预绑定参数。 如何定义一个 Python 函数 在 Python 中定义函数有多种方法。最常见的方法是使用 def 关键字,后跟函数名称和…

    2025年12月13日
    000
  • python如何获取当前日期

    在 Python 中获取当前日期有两种方法:使用 datetime.date.today() 直接获取当前日期(不含时间部分);使用 datetime.datetime.now().date() 获取当前日期和时间,然后提取日期部分。 如何用 Python 获取当前日期 获取当前日期的两种方法: 1…

    2025年12月13日
    000
  • python如何建立新文件夹

    对于使用 Python 创建新文件夹,步骤如下:导入 os 模块。使用 os.makedirs() 函数传递文件夹路径。处理错误,使用 try 和 except 语句捕获 OSError 异常。检查文件夹是否存在,使用 os.path.exists() 函数避免 FileExistsError 异常…

    2025年12月13日
    000
  • python如何换行继续编写

    Python 换行有三种方法:1)使用反斜杠();2)使用括号(());3)使用分号(;)。单行代码用反斜杠最简便,多行代码用括号更清晰,分号不推荐用于换行。 如何使用 Python 换行继续编写 在编写 Python 代码时,有时需要暂时断开一行,并在下一行继续编写。这通常是为了增强代码的可读性或…

    2025年12月13日
    000
  • python如何换行写代码

    Python 中可使用以下三种方法换行写代码:1. 在行末使用反斜杠 ();2. 使用括号 ();3. 使用分号 (;)。三重引号 (“””或”’) 可定义多行字符串。 Python 中换行写代码 在 Python 中,使用反斜杠()字符可…

    2025年12月13日
    000
  • python如何换行输入代码

    Python中换行输入代码的方法有:使用’n’符号使用多行字符串使用re.compile()使用第三方库(如line-by-line) Python中换行输入代码的方法 在Python中,可以使用input()函数从用户获取输入。默认情况下,input()函数会将所有输入视为…

    2025年12月13日
    000
  • python如何下载pip库

    使用 Pip 库可通过 pip install 命令下载 Python 库。额外选项包括:升级包(–U)、安装特定版本(== 标识符)、从特定源安装(–index-url)、离线安装(-r 标识符)和验证安装(pip freeze)。 如何使用 Python 下载 Pip 库…

    2025年12月13日
    000
  • python如何编写函数

    函数是可重复使用的代码块,可执行特定任务,需要输入,执行处理,并返回输出。编写 Python 函数的步骤包括:1. 定义函数;2. 添加参数;3. 编写函数体;4. 返回值;5. 调用函数。 如何编写 Python 函数 什么是函数? 函数是一组可重复使用的代码块,用于执行特定的任务。它们可以接受输…

    2025年12月13日
    000
  • 写python如何另起一行

    在 Python 中可使用不同的方法另起一行,包括:使用换行符(适用于不同的操作系统)使用 print() 方法,指定 “n” 作为结尾使用 write() 方法,写入 “n”使用特殊字符序列 “x0a”,等价于换行符 如何用 …

    2025年12月13日
    000
  • if __name__ =&#__main__&# 在 Python 中做什么?

    你可能在 python 脚本中经常看到这行代码 if __name__==”__main__”: ,但不知道它的实际用途是什么。别担心,因为在这个简短的博客中我们将讨论这个 当您直接运行程序或脚本时,python 会自动将“main”分配给特殊的name变量。这样做基本上是为…

    2025年12月13日
    000
  • 高知 D Soft Technologies 的 Python 学生取得的令人瞩目的成就

    在高知的 D Soft Technologies,我们的 Python 课程一直是周围许多最优秀学生的起点。这些学生每天都在挑战 Python 所能完成的极限。他们在这里期间接触过各种项目,从开发网络应用程序到构建机器学习模型。这些学生所做的很多工作都解决了实际问题,不仅展示了他们在技术上学到的知识…

    2025年12月13日
    000
  • python需要插件才能运行吗

    否,Python 无需插件即可运行。它附带了一个标准库,提供了各种功能,而无需安装任何额外的插件。但是,在某些情况下您可能需要插件,例如:① 安装特定库或模块 ② 增强 IDE 集成 ③ 集成第三方软件。 Python 需要插件才能运行吗? 回答:否,Python 无需插件即可运行。 详细解答: P…

    2025年12月13日
    000
  • python如何新建一个文件夹

    Python 中创建文件夹的方法:导入 os 模块。指定文件夹路径。使用 os.makedirs() 函数创建文件夹。处理潜在的异常。验证文件夹是否已创建。 如何使用 Python 创建文件夹 在 Python 中,可以使用 os 模块来创建文件夹。以下步骤演示如何创建文件夹: 导入 os 模块 i…

    2025年12月13日
    000
  • python如何安装pip工具

    Pip 是 Python 包管理器,用于安装、管理和卸载 Python 包。安装 Pip 的步骤包括:检查现有 pip 版本。如果未安装,下载 get-pip.py 脚本并使用 Python 运行它。验证 pip 安装。 如何安装 Python 的 Pip 工具 Pip 是 Python 包管理器,…

    2025年12月13日
    000
  • 使用 Python3 构建 Web 应用程序

    要使用 python 3 构建 web 应用程序,您可以使用 flask 框架。 flask 轻量、灵活,非常适合快速创建 web 应用程序。以下是开始的步骤: 安装 flask: 首先,激活你的python环境并使用pip安装flask: source env/bin/activate # act…

    2025年12月13日
    000
  • 如何预处理数据集

    简介 泰坦尼克号数据集是数据科学和机器学习项目中使用的经典数据集。它包含有关泰坦尼克号乘客的信息,目标通常是预测哪些乘客在灾难中幸存。在构建任何预测模型之前,预处理数据以确保数据干净且适合分析至关重要。这篇博文将指导您完成使用 python 预处理泰坦尼克号数据集的基本步骤。 第 1 步:加载数据 …

    2025年12月13日
    000
  • eek Data 职业训练营:方向和基础

    5 周数据职业训练营 是 LuxDevHQ 计划,旨在揭开数据职业的神秘面纱,让广泛的人可以免费学习,无论他们的背景或专业知识如何。 这些计划提供了学习结构和参考空间,您可以在其中获得构建您的“世界级数据职业”所需的所有材料。 在该计划中,我们认识到数据职业有潜力为各个领域和行业带来有价值的见解和解…

    2025年12月13日
    000
  • Python:“replace()”和“resub()”方法之间的差异

    介绍 python 中的 .replace() 方法和 .re.sub() 函数都用于替换部分字符串,但它们具有不同的功能和用例。以下是它们之间的根本区别: 模块和使用上下文:.replace():属于str类。用作字符串对象的方法。语法:str.replace(old, new, count=-1…

    2025年12月13日
    000
  • python如何换行输出变量

    在 Python 中换行输出变量的方法:使用转义字符 “n” 在字符串中表示换行。指定 print() 函数的 end 参数为 “n”。将字符串包裹在多行引号中,使用三个单引号或三个双引号。 如何在 Python 中换行输出变量 在 Python 中,…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信