【附代码】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.mzph.cn/news/193901.shtml

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

相关文章

SpringMVC常用注解和用法总结

目标: 1. 熟悉使用SpringMVC中的常用注解 目录 前言 1. Controller 2. RestController 3. RequestMapping 4. RequestParam 5. PathVariable 6. SessionAttributes 7. CookieValue 前言 SpringMVC是一款用于构建基于Java的Web应用程序的框架,它通…

Debian12配置ssh服务器

Debian12配置ssh服务器 安装ssh-server sudo apt install openssh-server启动ssh sudo systemctl start ssh启用ssh sudo systemctl enable ssh查看ssh状态 sudo systemctl status ssh可以看到有enabled和running字样 说明ssh启用成功 连接到服务器 # username是你的用…

Lag-Llama:基于 LlaMa 的单变量时序预测基础模型

文章构建了一个通用单变量概率时间预测模型 Lag-Llama,在来自Monash Time Series库中的大量时序数据上进行了训练,并表现出良好的零样本预测能力。在介绍Lag-Llama之前,这里简单说明什么是概率时间预测模型。概率预测问题是指基于历史窗口内的…

基于Java SSM框架实现师生交流答疑作业系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现师生交流答疑作业系统演示 摘要 在新发展的时代,众多的软件被开发出来,给用户带来了很大的选择余地,而且人们越来越追求更个性的需求。在这种时代背景下,人们对师生交流平台越来越重视,更好的实…

java高校实验室排课学生考勤系统springboot+vue

随着各高校办学规模的迅速扩大,学科专业的不断拓宽,传统的实验教学和实验室管理方法已经不能适应学校管理的要求,特别是化学实验室的管理,化学实验室仪器药品繁杂多样,管理任务繁重,目前主要使用人工记录方法管理,使用不便,效率低下,而且容易疏漏.时间一长将产生大量的文件和数…

使用postman请求x5接口

x5接口简介 1.接口样例 {"header"{"appid":"bpmnew_fanwei","sign":"C033162E86E4CADE80C7EB44D68A5AD2","sign_type":"md5","url":"https://oa.mioffice.cn/api/bpm/xm/app/show/tod…

Linux:服务器管理工具宝塔(bt)安装教程

一、简介 bt宝塔Linux面板是提升运维效率的服务器管理软件,支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等多项服务的管理功能 二、安装 使用 SSH 连接工具,如堡塔SSH终端连接到您的 Linux 服务器后,挂载磁盘,根据系统执…

冗余链路和生成树协议

文章目录 冗余链路生成树协议 冗余链路 背景:在许多交换机或者交换机设备组成的网络环境中,通常都使用一些备份连接,来提高网络的健全。在金融网中A和B之间不止一条线路,保证网络的安全性能。备份连接也叫做冗余链路 冗余链路带…

Redis ziplist源码解析

area |<---- ziplist header ---->|<----------- entries ------------->|<-end->|size 4 bytes 4 bytes 2 bytes ? ? ? ? 1 byte--------------------------------------------------------------- comp…

机器学习笔记 - 什么是3D语义场景完成/补全?

一、什么是3D语义场景补全? 3D 语义场景完成(Semantic Scene Completion)是一种机器学习任务,涉及以体素化形式预测给定环境的完整3D场景(完成3D形状的同时推断场景的 3D 语义分割的任务)。这是通过使用深度图和为场景提供上下文的可选 RGB 图像来完成的。目标是以一种可轻…

LeedCode刷题---子数组问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、最大子数组和 题目链接&#xff1a;最大子数组和 题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连…

【力扣】——可获得的最大点数(滑动窗口)

几张卡牌 排成一行&#xff0c;每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动&#xff0c;你可以从行的开头或者末尾拿一张卡牌&#xff0c;最终你必须正好拿 k 张卡牌。 你的点数就是你拿到手中的所有卡牌的点数之和。 给你一个整数数组 cardPoi…

[山东大学操作系统课程设计]实验三

0.写在前面(重点) 由于一些突发事件&#xff0c;导致目前大家手里或多或少都有了完整版的答案了。甚至很多学长学姐们写的代码远比我写的要好很多。 但是这个系列我觉得还是稍微坚持下去一点&#xff0c;或许某些地方可以帮到未来的同学们。 还是那句话&#xff0c;有需要可…

Spring MVC数据绑定的几种方法(一)

这篇文章包含spring mvc的默认数据类型绑定和简单数据类型绑定。内容来自实验。 准备&#xff1a; &#xff08;1&#xff09;在IDEA环境中从archetye创建webapp类型的maven项目exp6。 &#xff08;2&#xff09;在src\main目录下创建并标注java源代码文件夹和resources资源文…

NVIDIA GPU Operator install in kubernetes

文章目录 1. 简介2. Kubernetes 安装3. OS配置4. Docker Engine&#xff0c;cri-dockerd安装5. 安装 kubeadm6. GPU-Operator安装 1. 简介 Kubernetes通过设备插件框架提供对特殊硬件资源的访问&#xff0c;如NVIDIA GPU、⽹卡、Infiniband适配器和其他设备。但是&#xff0c;…

基于Java SSM框架实现实现四六级英语报名系统项目【项目源码+论文说明】

基于java的SSM框架实现四六级英语报名系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个高校四六级报名管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作…

2024美赛数学建模资料---100%获奖资料

很好的教程了 一共二十四章 每一章都是一个模型 并且有matlab编程编码 第一章 线性规划 第二章 整数规划 第三章 非线性规划 第四章 动态规划 第五章 图与网络 第六章 排队论 第七章 对策论 第八章 层次分析法 第九章 插值与拟合 第十章 数据的统计描述和分析 第十一章…

详解Spring对Mybatis等持久化框架的整合

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

自带灯效的气传导耳机,声音当然好听,哈氪聆光体验

现在市场上的蓝牙耳机种类繁多&#xff0c;入耳式的算是主流&#xff0c;但不太适合户外使用 &#xff0c;我平时出门健身、散步的时候&#xff0c;更喜欢用气传导耳机。气传导耳机通常采用挂耳式的设计&#xff0c;耳机不入耳&#xff0c;佩戴舒适度更好&#xff0c;而且稳定性…

Linux安装mongodb数据库(详细)

一、下载安装包 本文使用 tgz 方式,根据服务器类型在官网下载 MongoDB 安装包。官方地址&#xff1a;https://www.mongodb.com/try/download/community 下载方式如图所示&#xff1a; 选择版本 关于 MongoDB 的版本选择&#xff0c;参见如下版本差异&#xff1a; 1、将从官…