【附代码】Python函数性能测试(perfplot)

文章目录

    • 相关文献
    • 测试电脑配置
    • 展开元素是list的list
    • 在numpy数组上映射函数的最有效方法
    • 数组numpy中唯一值的最有效频率计数方法
    • 反转numpy数组的最有效方法
    • 如何向 numpy 数组添加额外的列
    • 将 numpy 矩阵初始化为零或一以外的值

作者:小猪快跑

基础数学&计算数学,从事优化领域5年+,主要研究方向:MIP求解器、整数规划、随机规划、智能优化算法

如有错误,欢迎指正。如有更好的算法,也欢迎交流!!!——@小猪快跑

相关文献

  • Making a flat list out of list of lists in Python
  • Most efficient way to map function over numpy array
  • numpy: most efficient frequency counts for unique values in an array
  • Most efficient way to reverse a numpy array
  • How to add an extra column to an numpy array
  • Initializing numpy matrix to something other than zero or one

测试电脑配置

博主三千元电脑的渣渣配置:

CPU model: AMD Ryzen 7 7840HS w/ Radeon 780M Graphics, instruction set [SSE2|AVX|AVX2|AVX512]
Thread count: 8 physical cores, 16 logical processors, using up to 16 threads

展开元素是list的list

输入:

[[1, 2, 3],[4, 5, 6],[7],[8, 9]
]

输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

我们从两个维度测试,一种是sub-list的元素数量固定,增加list里面的元素:

f = lambda n: [list(range(10))] * n
f(1) = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
f(3) = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]

在这里插入图片描述

另一种是list里面的元素数量固定,增加sub-list的元素数量:

g = lambda n: [list(range(n))] * 10
g(1) = [[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
g(3) = [[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]

在这里插入图片描述

import functools
import itertools
import operator
import numpy as np
import perfplot
from matplotlib import pyplot as pltdef forfor(a):return [item for sublist in a for item in sublist]def sum_brackets(a):return sum(a, [])def functools_reduce(a):return functools.reduce(operator.concat, a)def functools_reduce_iconcat(a):return functools.reduce(operator.iconcat, a, [])def itertools_chain(a):return list(itertools.chain.from_iterable(a))def numpy_flat(a):return list(np.array(a).flat)def numpy_concatenate(a):return list(np.concatenate(a))def extend(a):out = []for sublist in a:out.extend(sublist)return outb = perfplot.bench(setup=lambda n: [list(range(10))] * n,# setup=lambda n: [list(range(n))] * 10,kernels=[forfor,sum_brackets,functools_reduce,functools_reduce_iconcat,itertools_chain,numpy_flat,numpy_concatenate,extend,],n_range=[2 ** k for k in range(16)],xlabel="num lists (of length 10)",# xlabel="len lists (10 lists total)"
)plt.figure(dpi=300)
b.save("out.png")
b.show()

在numpy数组上映射函数的最有效方法

我们有numpy数组,期望对每个元素做同样的函数操作

import numpy as np x = np.array([1, 2, 3, 4, 5])# Obtain array of square of each element in x
squarer = lambda t: t ** 2
squares = np.array([squarer(xi) for xi in x])

如果你试图向量化的函数已经被向量化了(就像上面的x**2例子),那么使用它比其他任何东西都快得多(注意对数比例):

在这里插入图片描述

import numpy as np
import perfplot
import mathfrom matplotlib import pyplot as pltdef f(x):# return math.sqrt(x)return np.sqrt(x)vf = np.vectorize(f)def array_for(x):return np.array([f(xi) for xi in x])def array_map(x):return np.array(list(map(f, x)))def fromiter(x):return np.fromiter((f(xi) for xi in x), x.dtype)def vectorize(x):return np.vectorize(f)(x)def vectorize_without_init(x):return vf(x)b = perfplot.bench(setup=np.random.rand,n_range=[2 ** k for k in range(20)],kernels=[f,array_for,array_map,fromiter,vectorize,vectorize_without_init,],xlabel="len(x)",
)plt.figure(dpi=300)
b.save("out1.png")
b.show()

数组numpy中唯一值的最有效频率计数方法

输入:

[14, 31, 27, 27, 31, 13, 14, 13]

输出:

Item frequency:
[[13  2][14  2][27  2][31  2]
]

在这里插入图片描述

# numpy most efficient frequency counts for unique values in an array
import numpy as np
import pandas as pd
import perfplot
from matplotlib import pyplot as pltdef bincount(a):y = np.bincount(a)ii = np.nonzero(y)[0]return np.vstack((ii, y[ii])).Tdef unique(a):unique, counts = np.unique(a, return_counts=True)return np.asarray((unique, counts)).Tdef unique_count(a):unique, inverse = np.unique(a, return_inverse=True)count = np.zeros(len(unique), dtype=int)np.add.at(count, inverse, 1)return np.vstack((unique, count)).Tdef pandas_value_counts(a):out = pd.value_counts(pd.Series(a))out.sort_index(inplace=True)out = np.stack([out.keys().values, out.values]).Treturn outb = perfplot.bench(setup=lambda n: np.random.randint(0, 1000, n),kernels=[bincount, unique, unique_count, pandas_value_counts],n_range=[2 ** k for k in range(26)],xlabel="len(a)",
)
plt.figure(dpi=300)
b.save("out.png")
b.show()

反转numpy数组的最有效方法

输入:

[1, 3, 2]

输出:

[2, 3, 1]

在这里插入图片描述

import numpy
import perfplot
from matplotlib import pyplot as pltb = perfplot.bench(setup=lambda n: numpy.random.randint(0, 1000, n),kernels=[lambda a: a[::-1],lambda a: numpy.ascontiguousarray(a[::-1]),lambda a: numpy.fliplr([a])[0],],labels=["a[::-1]", "ascontiguousarray(a[::-1])", "fliplr"],n_range=[2 ** k for k in range(25)],xlabel="len(a)",
)
plt.figure(dpi=300)
b.save('out.png')
b.show()

如何向 numpy 数组添加额外的列

输入:

[14, 31, 27, 27]

输出:

[[14, 14],[31, 31],[27, 27],[27, 27]
]

在这里插入图片描述

import numpy as np
import perfplot
from matplotlib import pyplot as pltb = perfplot.bench(setup=np.random.rand,kernels=[lambda a: np.c_[a, a],lambda a: np.ascontiguousarray(np.stack([a, a]).T),lambda a: np.ascontiguousarray(np.vstack([a, a]).T),lambda a: np.column_stack([a, a]),lambda a: np.concatenate([a[:, None], a[:, None]], axis=1),lambda a: np.ascontiguousarray(np.concatenate([a[None], a[None]], axis=0).T),lambda a: np.stack([a, a]).T,lambda a: np.vstack([a, a]).T,lambda a: np.concatenate([a[None], a[None]], axis=0).T,],labels=["c_","ascont(stack)","ascont(vstack)","column_stack","concat","ascont(concat)","stack (non-cont)","vstack (non-cont)","concat (non-cont)",],n_range=[2 ** k for k in range(23)],xlabel="len(a)",
)
plt.figure(dpi=300)
b.save("out.png")
b.show()

将 numpy 矩阵初始化为零或一以外的值

在这里插入图片描述

import numpy
import perfplot
from matplotlib import pyplot as pltval = 42.0def fill(n):a = numpy.empty(n)a.fill(val)return adef colon(n):a = numpy.empty(n)a[:] = valreturn adef full(n):return numpy.full(n, val)def ones_times(n):return val * numpy.ones(n)def list(n):return numpy.array(n * [val])b = perfplot.bench(setup=lambda n: n,kernels=[fill, colon, full, ones_times, list],n_range=[2 ** k for k in range(20)],xlabel="len(a)",
)
plt.figure(dpi=300)
b.save("out.png")
b.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/209075.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于helm的方式在k8s集群中部署gitlab - 备份恢复(二)

接上一篇 基于helm的方式在k8s集群中部署gitlab - 部署(一),本篇重点介绍在k8s集群中备份gitlab的数据,并在虚拟机上部署相同版本的gitlab,然后将备份的数据进行还原恢复 文章目录 1. 备份2. 恢复到虚拟机上的gitlab2.…

第九节HarmonyOS 常用基础组件4-Button

一、Button Button组件主要用来响应点击操作,可以包含子组件。 示例代码: Entry Component struct Index {build() {Row() {Column() {Button(确定, { type: ButtonType.Capsule, stateEffect: true }).width(90%).height(40).fontSize(16).fontWeigh…

软件工程精品课程教学网站的设计与实现

系统功能需求分析 本系统要求采用Browser/Server模式设计开发,可以作为一般高等院校的网络学堂;可以为教师的辅助教学或者网络教学提供一个完善的教学网站;学生可以利用本教学网站来完成一些课程的学习任务。 2.2.1 功能划分 《软件工程》教学…

解决top-k问题--堆排序

目录 TOP-K问题 堆排序 考虑以下情况: 1.在n个数里面找最大的一个数 2.在n个数里面找最大的两个数 3.在n个数中求前k大的数 为什么不用大根堆呢? 代码 时间复杂度 TOP-K问题 即求数据结合中前K个最大的元素或者最小的元素,一般情况下数…

Java基本数据类型详解

✨个人主页:全栈程序猿的CSDN博客 💨系列专栏:Java从入门到精通 ✌座右铭:编码如诗,Bug似流星,持续追求优雅的代码,解决问题如同星辰般自如 Java是一种强类型语言,数据类型在程序中起…

iOS NSDate的常用API

目录 一、创建日期 1.获取当前时间 2.当前时间指定秒数之后/前的时间 3.指定日期之后/后的时间 4.2001年之后/前指定秒数的时间 5.1970年之后/后指定秒数的时间 二、初始化日期 1.init 2.时间间指定秒数的时间 3.指定时间指定秒数之前/后的时间 4.2001年指定秒数之后…

QML中常见布局方法

目录 引言常见方法锚定(anchors)定位器Row、ColumnGridFlow 布局管理器RowLayout、ColumnLayoutGridLayoutStackLayout 总结 引言 UI界面由诸多元素构成,如Label、Button、Input等等,各种元素需要按照一定规律进行排布才能提高界…

Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(二)视图模板、静态资源访问

学习视频:孙哥说SpringMVC:结合Thymeleaf,重塑你的MVC世界!|前所未有的Web开发探索之旅 衔接上文Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(一) SpingMVC中…

创建JDK8版本的SpringBoot项目的方法

目录 一.通过阿里云下载 二.通过IDEA创建 1.下载安装JDK17 2.创建SpringBoot 3.X的项目 3.把JDK17改成JDK8 截止到2023.11.24,SpringBoot不再支持3.0X之前的版本,3.0X之后的版本所对应的JDK版本为JDK17,下面介绍如何在idea上继续使用JDK…

python动态圣诞下雪图

运行图片 代码 import pygame import random# 初始化Pygame pygame.init()# 创建窗口 width, height 800, 600 screen pygame.display.set_mode((width, height)) pygame.display.set_caption(Christmas Tree)# 定义颜色 GREEN (34, 139, 34) RED (255, 0, 0) WHITE (255…

彻底删除VsCode配置和安装过的插件与缓存

前言 当你准备对 Visual Studio Code(VSCode)进行重新安装时,可能遇到一个常见问题:重新安装后,新的安装似乎仍然保留了旧的配置信息,这可能会导致一些麻烦。这种情况通常是由于卸载不彻底所致&#xff0c…

视图层与模板层

视图层 1 视图函数 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是…

android studio安装SDK时无法勾选

这两天帮助学妹安装android studio安装SDK时无法勾选,记录一下最终解决办法。头大。 核心 360 问题 网上所有方法都尝试了包括挂梯子,改hosts,盘符权限等等。 最终解决下载360 使用这两个,DNS注意要用8.8.8.8的 成功解决

C语言——指针(三)

📝前言: 上篇文章C语言——指针(二)中对:指针的运算和指针变量类型对指针使用的影响开展了进一步的探讨,这篇文章我们继续学习一下指针与一维数组之间的关系: 1,对数组名的理解 2&am…

Go语言 值传递

官方说法,Go中只有值传递,没有引用传递 而Go语言中的一些让你觉得它是引用传递的原因,是因为Go语言有值类型和引用类型,但是它们都是值传递。 值类型 有int、float、bool、string、array、sturct等 引用类型有slice&#xff0c…

Python笔记1.2(with open() as file和open()、logging、os、shutil、glob、decode和encode)

Python笔记1.1(字符串日期转换、argparse、sys、overwrite、eval、json.dumpsloads、os.system(cmd)、zfill、endswith、深浅拷贝) Python笔记2(函数参数、面向对象、装饰器、高级函数、捕获异常、dir) Python笔记1.2 13、with …

PyLMKit(3):基于角色扮演的应用案例

角色扮演应用案例RolePlay 0.项目信息 日期: 2023-12-2作者:小知课题: 通过设置角色模板并结合在线搜索、记忆和知识库功能,实现典型的对话应用功能。这个功能是大模型应用的基础功能,在后续其它RAG等功能中都会用到这个功能。功…

Linux的基本指令(3)

目录 制作小文件&查看 nano指令 cat指令 tac指令 制作大文件&查看 一切皆文件 echo指令 > 输出重定向 以写"w"的形式打开文件 以追加"a"的形式打开文件 cat指令 < 输入重定向 创建big.txt more指令 less指令&#xff08;推…

Docker—更新应用程序

在本部分中&#xff0c;你将更新应用程序和映像。您还将了解如何停止和移除容器。 一、更新源代码 在以下步骤中&#xff0c;当您没有任何待办事项列表项时&#xff0c;您将把“空文本”更改为“您还没有待办事项&#xff01;在上面添加一个&#xff01;” 1、在src/static/…

HTML5 的全局属性 hidden 和 display:none 的关系

目录 1&#xff0c;hidden 和 display:none 的关系2&#xff0c;其他隐藏元素的方式2.1&#xff0c;语意上的隐藏2.2&#xff0c;视觉上的隐藏 1&#xff0c;hidden 和 display:none 的关系 hidden - MDN 参考 一句话总结&#xff1a;hidden 是HTML5 新增的全局布尔属性&…