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

news2025/2/3 13:11:30

转载请注明出处:小锋学长生活大爆炸[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 为 int32
    return 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 为 int32
    return 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.coloradmin.cn/o/2091847.html

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

相关文章

【SuperCraft AI:无限工作流画布】

SuperCraft AI:无限工作流画布 SuperCraft 是一款全新的 AI 工具。它具有将手绘草图转换为不同产品图像的功能,提供了一个无限大的协作画布,让设计师能够在此手绘草图,并利用生成式 AI 技术将草图转化为高质量的 2D 图像和 3D 渲…

NC 二分查找-II

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 请实现有重复…

Unity TreeView扩展

实现效果 这里原来是做的一个检测网络、事件回调耗时的工具。简单改了成了一个演示TreeView的demo。实现了TreeView的基本功能并且实现了对列的排序。TreeView还可以制作点击,双击,右键等事件,但这里暂时不需要用到。 思维导图 工程&#xf…

arcgisjs4.0 内网部署字体不显示问题处理

问题背景问题定位解决方案 问题背景 内网环境,通过压缩包的hash值验证了包是一摸一样的,ningx也读到了index.html,但是网格的字提显示出不来,并且地图上的注记文字均不显示 本地环境地图情况: 内网环境地图情况&…

Bluetooth: att protocol

一篇搞懂 ATT 支持的东西都有什么。 READ_BY_GROUP_TYPE_REQ/RSP 如下是 Spec 内容: The attributes returned shall be the attributes with the lowest handles within the handle range. These are known as the requested attributes.If the attributes with the requeste…

石油设备和相关机械都包涵那些?

关键字:钻杆测径仪,泵管测径仪,固井管道直线度测量仪,输送管测径仪,输送管检测设备, 石油设备是指在石油和天然气的勘探、开发、生产、储存和运输等过程中使用的各种机械和装置。这些设备通常包括但不限于…

黄力医生科普:如何有效预防冠心病,这几个保健措施不可少!

冠心病,作为心血管系统的一种常见病,主要因冠状动脉粥样硬化导致管腔狭窄或闭塞,进而引发心肌缺血缺氧。此病多发于中老年群体,且具有一定遗传性。然而,无论发病因素如何,我们都可以通过一系列有效的预防措…

C++类和对象(6)——初始化列表

一般的初始化 class A { public:A(int a){ //一般的初始化&#xff0c;在{}括号里面给成员变量赋值_a a;cout << _a << endl;}~A() {}private:int _a; }; 用 初始化列表 初始化 当成员变量是以下两种情况时&#xff0c; 必须使用初始化列表&#xff01; cons…

单自由度无阻尼系统振动分析

特别感谢&#xff1a;https://www.bilibili.com/video/BV114411y7ab/?p6&spm_id_frompageDriver&vd_sourceebe07816bf845358030fc92d23830b29 本文图片该系列视频 tips&#xff1a;关于特征方程与振动方程&#xff1a; 特征方程有助于我们理解和确定系统的固有频率和模…

【算法】贪心算法解析:基本概念、策略证明与代码例题演示

文章目录 1. 什么是贪心算法&#xff1f;2. 贪心算法的特点3. 例题&#xff08;贪心策略&#xff09;① 找零问题② 最小路径和③ 背包问题 4. 贪心策略证明 1. 什么是贪心算法&#xff1f; 在学习贪心算法之前&#xff0c;一定要理解的是贪心策略&#xff1a; 贪心策略是一种…

Ubuntu中qt类与类信号槽的创建及使用

今天学习到了新的一个小玩意&#xff0c;我们在QT中创建一个大项目的时候一般会创建多个类&#xff0c;那我们就来学习一下如何在自定义的类中声名和使用信号与槽函数。 首先我们CTRLn来创建我们新的类&#xff1a; 我们创建新的C的类&#xff0c;一个School&#xff0c;一个S…

举办知识竞赛是线上好还是线下好

举办知识竞赛线上和线下各有优势&#xff0c;选择哪种方式取决于具体的需求和条件。 线上举办知识竞赛的优缺点&#xff1a; 优点&#xff1a; 便捷性&#xff1a;线上竞赛不受地域限制&#xff0c;参与者可以在任何有网络的地方参与。 选手数&#xff1a;可以同时满足人数较…

单门店共享自习室小程序系统源码搭建对接门禁和空开api

共享自习室小程序&#xff0c;单门店共享自习室小程序&#xff0c;有源码&#xff0c;对接门禁和电控api接口&#xff0c;php开发语言&#xff0c;前端是uniapp。可以源码搭建&#xff0c;也可以二开或定制。 一 用户端 在线选择预约时间&#xff0c;选择座位&#xff0c;选择…

macOS搭建Python3.11+Django4.2.15的平台框架使用Poetry管理

最近想使用Python开发&#xff0c;使用Django框架搭建平台&#xff0c;之前没有使用过Python&#xff0c;所以记录下整个过程&#xff1a; 1、Python版本的选择&#xff0c;直接去官网【Download Python | Python.org】看最新稳定版是哪个版本&#xff0c;选择安装&#xff0c…

Ascend C算子开发(入门)—— 什么是算子?

文章目录 Ascend C算子开发&#xff08;入门&#xff09;—— 什么是算子&#xff1f;一、从人工智能到算子1.1 人工智能的四个层面1.2 人工智能之三大流派1.3 算子、神经元、神经网络 二、算子的基本概念2.1 算子在数学中的定义&#xff1a;2.2 算子基本概念 —— 总览2.3 算子…

利用clip模型实现text2draw

参考论文 实践 有数据增强的代码 import math import collections import CLIP_.clip as clip import torch import torch.nn as nn from torchvision import models, transforms import numpy as np import webp from PIL import Image import skimage import torchvision …

基于单片机的楼宇消防控制系统设计

本设计基于单片机的楼宇消防控制系统&#xff0c;主要包括温湿度检测模块、空气质量检测模块、火焰检测模块、ZigBee通信模块、报警模块和自动喷水模块。首先&#xff0c;系统通过温湿度检测模块实时监测楼道内的温湿度状况&#xff0c;以便及时掌握火灾发生前的环境变化。其次…

足底筋膜炎怎么治疗效果好

足底筋膜炎的症状 足底筋膜炎是一种常见的足部疾病&#xff0c;主要表现为足底区域&#xff08;尤其是脚跟附近&#xff09;的疼痛和不适。这种疼痛在早晨起床或长时间休息后初次站立时尤为明显&#xff0c;被形象地称为“晨间痛”。随着行走时间的增加&#xff0c;疼痛可能会…

直击源头!劳保鞋厂家揭秘机械制造业防护安全鞋挑选秘籍

在机械制造业这一高风险、高强度的行业中&#xff0c;选择合适的劳保鞋对于保障工人的安全至关重要。作为劳保鞋的生产厂家&#xff0c;我们深知一双优质的防护鞋能为工人提供怎样的保护。今天百华小编和大家从多个维度看一下机械制造业是如何挑选防护安全鞋的挑选秘籍&#xf…

四款远程控制分享!你pick哪一款?

远程控制软件已经成为我们日常生活中不可或缺的一部分&#xff0c;无论是远程办公、技术支持还是家庭娱乐&#xff0c;这些软件都扮演着重要的角色。今天&#xff0c;我们就来聊聊几款市面上比较热门的远程控制软件在电脑远程操作上都有哪些表现呢&#xff1f;让我们一探究竟。…