【教程】实测np.fromiter 和 np.array 的性能

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn]

如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~

目录

函数简介

np.fromiter

np.array

测试代码

实验结果

结果分析

实验总结

学长想说


函数简介

np.fromiter

np.fromiter 是 NumPy 提供的一个函数,用于从可迭代对象(如生成器、列表等)创建一个 NumPy 数组。它直接从可迭代对象中逐个读取数据,适合在数据量较大或数据生成过程中节省内存的场景。

优点:

  • 内存效率高:从可迭代对象中逐个读取数据而不是一次性加载所有数据,适合处理大数据量。
  • 速度较快:在特定情况下(尤其是数据量大时),由于从迭代器逐个读取数据,可能比 np.array 更快。

缺点:

  • 适用于从迭代器或生成器创建数组,对于已经存在的 Python 序列(如列表、元组)不具备明显优势。

np.array

np.array 是 NumPy 最常用的函数之一,用于将输入数据(如列表、元组、嵌套序列等)转换为 NumPy 数组。它会一次性读取输入数据并将其存储到内存中的连续块中,适合在数据已经加载到内存中的场景。

优点:

  • 通用性强:可以从各种序列(如列表、元组等)或其他数组对象创建 NumPy 数组。
  • 易于使用:语法简单,使用场景广泛。

缺点:

  • 对于非常大的数据,可能需要一次性加载到内存中,内存消耗较大。
  • 处理生成器或迭代器时,性能可能不如 np.fromiter

测试代码

import numpy as np
import time
import pandas as pd
import matplotlib.pyplot as plt# 测试数据生成函数
def generate_data(size):return range(size)  # 使用生成器来模拟大量数据# 测试 np.fromiter 的性能
def test_fromiter_int32(data):start_time = time.time()np.fromiter(data, dtype=np.int32)return time.time() - start_time# 测试 np.array 的性能(不计算 list 开销)
def test_array_no_list_overhead(data):data = list(data)  # 先将生成器转换为列表start_time = time.time()np.array(data, dtype=np.int32)  # 确保 dtype 为 int32return time.time() - start_time# 测试 np.array 的性能(计算 list 开销)
def test_array_with_list_overhead(data):start_time = time.time()data = list(data)  # 生成器转换为列表的时间也包含在内np.array(data, dtype=np.int32)  # 确保 dtype 为 int32return time.time() - start_time# 数据量从 10^1 到 10^9
data_sizes = [10**i for i in range(1, 8)]  # 从 10^1 到 10^7
results_comparison = []for size in data_sizes:data = generate_data(size)# np.fromiter 性能测试fromiter_time_int32 = test_fromiter_int32(data)# np.array 性能测试(不计算 list 开销)data = generate_data(size)  # 重新生成数据array_time_no_list_overhead = test_array_no_list_overhead(data)# np.array 性能测试(计算 list 开销)data = generate_data(size)  # 重新生成数据array_time_with_list_overhead = test_array_with_list_overhead(data)results_comparison.append((size, fromiter_time_int32, array_time_no_list_overhead, array_time_with_list_overhead))# 将结果显示为数据框
df_results_comparison = pd.DataFrame(results_comparison, columns=['Data Size', 'Fromiter Time (s)', 'Array Time without List Overhead (s)', 'Array Time with List Overhead (s)'
])# 绘制比较性能曲线
plt.figure(figsize=(10, 6))
plt.plot(df_results_comparison['Data Size'], df_results_comparison['Fromiter Time (s)'], marker='o', label='np.fromiter (int32)')
plt.plot(df_results_comparison['Data Size'], df_results_comparison['Array Time without List Overhead (s)'], marker='o', label='np.array without list overhead (int32)')
plt.plot(df_results_comparison['Data Size'], df_results_comparison['Array Time with List Overhead (s)'], marker='o', label='np.array with list overhead (int32)')
plt.xlabel('Data Size')
plt.ylabel('Time (s)')
plt.xscale('log')  # 使用对数刻度显示更大范围的数据
plt.yscale('log')  # 使用对数刻度显示时间差异
plt.title('Performance Comparison: np.fromiter vs np.array (dtype=int32)')
plt.legend()
plt.grid(True)
plt.show()

实验结果

结果分析

        从实验结果和图表中,我们可以观察到 np.fromiternp.array(不计算列表开销)和 np.array(计算列表开销)在不同数据量下的性能表现差异。以下是对实验结果的详细分析:

1. 小数据量 (10^110^3)

  • 性能差异较小:在数据量较小时(如 10^110^3),三种方法的执行时间差异非常小。此时,数据的处理开销可以忽略不计,所有方法的性能表现几乎相同。
  • np.fromiter 稍慢:在这些小数据量下,np.fromiter 的执行时间稍微比 np.array 长。这是因为 np.fromiter 需要逐个元素地从生成器中读取数据,而 np.array 直接操作列表(尤其是不计算列表开销时)。

2. 中等数据量 (10^410^5)

  • 开销开始显现:当数据量增加到 10^4 及以上时,np.array 方法开始表现出性能差异。特别是,当我们计算列表转换开销时,np.array 的执行时间开始显著增加。
  • np.fromiter 表现稳定np.fromiter 在中等数据量下表现相对稳定,时间随数据量线性增长,这表明其适合处理较大规模的数据。

3. 大数据量 (10^6 及以上)

  • np.array 的开销显著增加:对于 10^5 以上的数据量,包含列表转换的 np.array 方法的执行时间显著增加,表明当数据量很大时,列表转换开销成为一个显著的瓶颈。
  • np.fromiter 和不包含列表转换的 np.array 方法更优:在处理大数据时,这两种方法的时间相对较低,尤其是不计算列表开销的 np.array 方法,在大数据量下明显比计算列表开销的 np.array 更快。

实验总结

  • np.fromiter 的优势:当处理非常大的数据量且数据来源是生成器时,np.fromiter 表现得非常稳定且高效,适合处理大数据量。
  • np.array(不包含列表开销)适合已有数据结构:如果你已经有一个数据结构(如列表),并且需要将其转换为 NumPy 数组,那么不包含列表转换的 np.array 是最有效的选择。
  • 避免不必要的列表转换:在处理大数据时,避免将生成器不必要地转换为列表可以显著提高性能。因此,除非必要,尽量使用 np.fromiter 或直接将列表转换为数组,而不是将生成器转换为列表再转为数组。

学长想说

        还有一种情况,如果变量aaa已经是tensor了,那么使用aaa.numpy()比以上方法都高效

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

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

相关文章

设计模式 -- 装饰者模式(Decorator Pattern)

1 问题引出 1.1 咖啡馆订单项目 咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡) 调料:Milk、Soy(豆浆)、Chocolate 要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便 使用…

无人机之云台的作用

无人机云台在无人机技术中扮演着至关重要的角色,其作用主要体现在以下几个方面: 一、 确保拍摄稳定性 防抖动:无人机在飞行过程中,尤其是在复杂环境下,如遇到风力干扰或进行高速飞行时,机身容易产生震动和…

Beyond Compare忽略特定格式文本,忽略匹配正则表达式

一 概述 文本对比时忽略某些文本。比如有些生成的文件需要做差异对比,除了内容有差异外,自动生成的ID也不同,想忽略这些ID。特别是文件内容比较多的时候。 如上图,其中UUID“*”的部分我想忽略。 二 方法 方法1 通过Beyond Co…

MySQL 中间件 MySQL-Router

目录 1 MySQL-Router 的介绍 2 MySQL-Router 负载均衡 2.1 设计目的: 2.2 HAProxy 与 Nginx 和 MySQL-Router 之间的区别 2.3 MySQL-Router 的优势 3 MySQL-Router 的获取 3 MySQL-Router 的使用 3.1 实验环境 3.2 MySQL-Router 部署 3.3 MySQL-Router 配置 3.4 测…

HarmonyOS--合理使用动画

一、概述 动画是应用开发中必不可少的部分,它可以使应用程序更加生动和易于互动,一方面可以提升用户体验、增强视觉吸引力,另一方面可以引导用户操作、提高信息传达效率。应用程序中,页面层级间的转场、点击交互、手势操控都可以添…

ODOO17文档打印(输出)方案 -- ODOO17 document printing (output) scheme

根据使用场景不同,ODOO17支持以下几种文档打印(输出)方案: According to different usage scenarios, ODOO17 supports the following document printing (output) schemes: 1、QWEB ODOO原生打印功能(生成PDF文档) odoo使用的主…

【AI】:探索在图像领域的无限可能

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 图像识别与分类的飞跃图像生成与创造的艺术图像增强与修复的神奇图像搜索与理解的智能图像分析与挖掘的洞察图形生成技术1. 生成对抗网络(GANs)2. 卷积神经网络(CN…

多语言跨领域迁移学习的新框架:MAD-X

人工智能咨询培训老师叶梓 转载标明出处 多语言模型如mBERT和XLM-R通过零样本或少样本跨语言迁移极大地推动了低资源语言的NLP应用。但这些模型由于容量限制,对低资源语言和未见语言的迁移性能并不理想。为了解决这一问题,来自德国达姆施塔特工业大学、…

Stable Diffusion详解

文章目录 前言一、LDM原理二、模型结构三、模型训练与推理总结 前言 Stable Diffusion在图像生成方面取得了很大的成功,其核心原理是LDM(Latent Diffusion Models),在论文《High-Resolution Image Synthesis with Latent Diffusio…

【数据结构】优先级队列 — 堆

文章目录 前言1. 优先级队列1.1 概念1.2 特性 2. 堆2.1 概念2.2 存储方式 3. 堆的模拟实现3.1 堆的创建3.2 堆的插入3.3 堆的删除 4. PriorityQueue4.1 注意事项4.2 构造器介绍4.3 常用方法介绍 5. 经典题型6. 结语 前言 我们之前学习过队列,它是遵循先进先出原则的…

halcon 深度学习软件工具安装以及用法

安装halcon 20版本以上得 以为这个版本以上得有异常检测,分割,分类,目标检测,都有 一、下载软件 可以再官网下载,但是官网要注册账号 下载区域: MVTec Software 不用官方的账号 就下载安装包 链接:http…

day13JS-MoseEvent事件

1. MouseEvent的类别 mousedown :按下键mouseup :释放键click :左键单击dblclick :左键双击contextmenu :右键菜单mousemove :鼠标移动mouseover : 鼠标经过 。 可以做事件委托,子元素可以冒泡…

使用Blender进行3D建模—基础操作笔记

Blender 3D 建模🚀 在博0阶段,目前已经完成立创EDA的PCB绘制的基础学习,树莓派的系统安装远程控制能学习,加上我本硕阶段学习的单片机和深度学习人工智能算法的知识,这里打算补上一块比较重要的能力拼图,就…

Netty 学习笔记

Java 网络编程 早期的 Java API 只支持由本地系统套接字库提供的所谓的阻塞函数,下面的代码展示了一个使用传统 Java API 的服务器代码的普通示例 // 创建一个 ServerSocket 用以监听指定端口上的连接请求 ServerSocket serverSocket new ServerSocket(5000); //…

c++关于字符串的练习

提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 #include <iostream> #include<string> using namespace std;int main() {string s1;int letter0,digit0,space0,other0;cout<<"请输入一个字符串:"…

海康二次开发学习笔记5-二次开发小技巧

二次开发小技巧 1. VM安装目录 Samples内包含C#,QT,VC应用程序 Documetnations内包含C#和C语言的帮助文档 2. 错误码 private void button4_Click(object sender, EventArgs e){try{VmSolution.Load(textBox1.Text);listBox1.Items.Add("方案加载成功.");listBox1.…

质量技术AI提效专题分享-得物技术沙龙

活动介绍 本次“质量技术&AI提效专题分享”沙龙聚焦于质量技术和AI效率领域&#xff0c;将为您带来四个令人期待的演讲话题&#xff1a; 1、《智能化提效实践》 2、《仿真自动化在饿了么金融实践分享》 3、《得物精准测试提效应用》 4、《广告算法灰度拦截实践》 相信这些…

开源的工作流系统突出优点总结

当前&#xff0c;想要实现高效率的办公&#xff0c;可以一起来了解低代码技术平台、开源的工作流系统的相关特点和功能优势。作为较受职场喜爱的平台产品&#xff0c;低代码技术平台拥有可视化才做界面、灵活、好维护操作等多个优势特点&#xff0c;在推动企业流程化办公的过程…

读软件开发安全之道:概念、设计与实施12不受信任的输入

1. 不受信任的输入 1.1. 不受信任的输入可能是编写安全代码的开发人员最关心的问题 1.1.1. 最好将其理解为输入系统中的所有不受信任的输入 1.1.2. 来自受信任的代码的输入可以提供格式正确的数据 1.2. 不受信任的输入是指那些不受你控制&#xff0c;并且可能被篡改的数据&…

RASA使用长文记录以及一些bug整理

RASA 学习笔记整理 一 安装 在虚拟环境中安装&#xff0c;进入python3版本的环境 conda activate python3 ai04机器旧版本&#xff1a;rasa-nlu和rasa-core是分开安装的 最新版本&#xff1a;rasa 将二者做了合并 直接安装 pip3 install rasa 在安装到如下步骤时候会报…