为什么Creating a tensor from a list of numpy.ndarrays is extremely slow

2023-12-21 21:50

本文主要是介绍为什么Creating a tensor from a list of numpy.ndarrays is extremely slow,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.问题简介

今天运行一个DQN的代码时出现了如下图的warning:

UserWarning: Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with numpy.array() before converting to a tensor. (Triggered internally at  C:\cb\pytorch_1000000000000\work\torch\csrc\utils\tensor_new.cpp:210.)state = torch.tensor([state], dtype=torch.float).to(self.device)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V58j2dP8-1651050416214)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220427155113673.png)]

警告说我们创建用一个包含numpy.ndarrays的列表创建tensor太慢了,建议我们转换为tensor之前考虑用numpy.array()将列表转换为一个单独的numpy.ndarry。

所以就想对tensor的转换这部分学习一下。

找到一篇文章:https://zhuanlan.zhihu.com/p/429901066

这篇文章介绍了一下这个问题,但是自己对于代码运行过程中数据类型的变换不是很懂,想弄透彻一点,所以记录一下代码的调试过程中变量类型的变换。

2.实验与结论

先说结论

如果list中没有ndarrays,则选择list->tensor更快。

如果list中有ndarrays,则选择list->ndarrays->tensor更快;

注:为了减小偶然因素的影响,所以将转换的部分运行10遍

2.1 list->tensor(注:list中的元素不含numpy.ndarrays)
import numpy as np
import torch
import timel = [i for i in range(50000000)]  # 五千万
stime = time.time()
for _ in range(10):a = torch.tensor(l)
etime = time.time()
print(f'用时: {etime-stime}s')
用时: 25.838355541229248s

调试过程中的变量记录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w24lkNAV-1651050416215)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220427163413678.png)]

2.2 list->numpy.ndarrays->tensor(注:list中的元素不含numpy.ndarrays)
import numpy as np
import torch
import timel = [i for i in range(50000000)]  # 五千万
stime = time.time()
for _ in range(10):a = torch.tensor(np.array(l))
etime = time.time()
print(f'用时: {etime-stime}s')
用时: 31.836950540542603s

调试过程中的变量记录:

import numpy as np
import torchl = [1, 2, 3, 4, 5]
a = np.array(l)
b = torch.tensor(a)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O5RrXfpg-1651050416216)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220427164241324.png)]

结论一:可以看到如果list中的元素不含有numpy.ndarrays时直接将list->tensor更快

2.3 list->tensor(注:list中的元素含numpy.ndarrays)
import numpy as np
import torch
import timel = [np.ones(1) for i in range(5000000)]  # 五百万
stime = time.time()
torch.tensor(l)
etime = time.time()
print(f'用时: {etime-stime}s')
用时: 3.9938528537750244s

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DsAOIor1-1651050416216)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220427165742016.png)]

调试过程中的变量记录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gOOEAHvg-1651050416217)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220427170003067.png)]

2.4 list->numpy.ndarraays->tensor(注:list中的元素含numpy.ndarrays)
l = [np.ones(1) for i in range(5000000)]  # 五百万
stime = time.time()
a = np.array(l)
b = torch.tensor(a)
etime = time.time()
print(f'用时: {etime-stime}s')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GhwRAbJ5-1651050416218)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20220427170322440.png)]

用时: 1.8933970928192139s

调试过程中的变量记录:

在这里插入图片描述

结论二:如果list中有ndarrays,则选择list->ndarrays->tensor更快

这篇关于为什么Creating a tensor from a list of numpy.ndarrays is extremely slow的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/521612

相关文章

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At

List list = new ArrayList();和ArrayList list=new ArrayList();的区别?

List是一个接口,而ArrayList 是一个类。 ArrayList 继承并实现了List。 List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。而ArrayList list=new ArrayList();创建一对象则保留了A

python科学计算:NumPy 线性代数与矩阵操作

1 NumPy 中的矩阵与数组 在 NumPy 中,矩阵实际上是一种特殊的二维数组,因此几乎所有数组的操作都可以应用到矩阵上。不过,矩阵运算与一般的数组运算存在一定的区别,尤其是在点积、乘法等操作中。 1.1 创建矩阵 矩阵可以通过 NumPy 的 array() 函数创建。矩阵的形状可以通过 shape 属性来访问。 import numpy as np# 创建一个 2x3 矩阵mat

探索Python的数学魔法:Numpy库的神秘力量

文章目录 探索Python的数学魔法:Numpy库的神秘力量背景:为什么选择Numpy?Numpy是什么?如何安装Numpy?五个简单的库函数使用方法场景应用常见Bug及解决方案总结 探索Python的数学魔法:Numpy库的神秘力量 背景:为什么选择Numpy? 在Python的世界中,数据处理和科学计算是不可或缺的一部分。但原生Python在处理大规模数据时可能会显

处理List采用并行流处理时,通过ForkJoinPool来控制并行度失控的问题

在使用parallelStream进行处理list时,如不指定线程池,默认的并行度采用cpu核数进行并行,这里采用ForJoinPool来控制,但循环中使用了redis获取key时,出现失控。具体上代码。 @RunWith(SpringRunner.class)@SpringBootTest(classes = Application.class)@Slf4jpublic class Fo

Java中集合类Set、List和Map的区别

Java中的集合包括三大类,它们是Set、List和Map,它们都处于java.util包中,Set、List和Map都是接口,它们有各自的实现类。Set的实现类主要有HashSet和TreeSet,List的实现类主要有ArrayList,Map的实现类主要有HashMap和TreeMap。那么它们有什么区别呢? Set中的对象不按特定方式排序,并且没有重复对象。但它的有些实现类能对集合中的对

List对象过滤

List materialInventoryList = materialInventories.stream().filter(mat -> mat.getQty().compareTo(BigDecimal.ZERO) > 0).collect(Collectors.toList()); stream().filter()方法可以过滤掉List的数据

c++stack和list 介绍

stack介绍 堆栈是一种容器适配器,专门设计用于在 LIFO 上下文(后进先出)中运行,其中元素仅从容器的一端插入和提取。 堆栈作为容器适配器实现,容器适配器是使用特定容器类的封装对象作为其基础容器 的类,提供一组特定的成员函数来访问其元素。元素从特定容器的 “back” 推送或弹出,这称为堆栈的顶部。 stack接口 stack() 构造空的栈 empty() 检测stack是否为