[英]Python loop faster than Pandas
下面的代码将显示使用python循环比使用Pandas更快。 在测试之前,我的理解是不同的。 所以我想知道我是否错误地将熊猫用于此操作? 下面的代码显示Pandas解决方案的速度慢了大约7倍:
Pandas time 0.0008931159973144531
Loop time 0.0001239776611328125
码:
import pandas as pd
import numpy as np
import time
import torch
batch_size = 5
classes = 4
raw_target = torch.from_numpy(np.array([1, 0, 3, 2, 0]))
rows = np.array(range(batch_size))
t0 = time.time()
zeros = pd.DataFrame(0, index=range(batch_size), columns=range(classes))
zeros.iloc[[rows, raw_target.numpy()]] = 1
t1 = time.time()
print("Pandas time ", t1-t0)
t0 = time.time()
target = raw_target.numpy()
zeros = np.zeros((batch_size, classes), dtype=np.float64)
for zero, target in zip(zeros, target):
zero[target] = 1
t1 = time.time()
print("Loop time ", t1-t0)
该代码使用PyTorch
因为存在问题的实际代码使用PyTorch
。 什么是这个示例的更好/最优解决方案? 结果矩阵为:
[[0. 1. 0. 0.]
[1. 0. 0. 0.]
[0. 0. 0. 1.]
[0. 0. 1. 0.]
[1. 0. 0. 0.]]
根据您的用例,使所有内容都通过PyTorch运行可能是有利的(例如,将所有计算保留在GPU上)。
仅PyTorch的解决方案将遵循numpy语法(即zeros[rows, raw_target] = 1.
):
import numpy as np
import torch
batch_size = 5
classes = 4
raw_target = torch.from_numpy(np.array([1, 0, 3, 2, 0]))
rows = torch.range(0, batch_size-1, dtype=torch.int64)
x = torch.zeros((batch_size, classes), dtype=torch.float64)
x[rows, raw_target] = 1.
print(x.detach())
# tensor([[ 0., 1., 0., 0.],
# [ 1., 0., 0., 0.],
# [ 0., 0., 0., 1.],
# [ 0., 0., 1., 0.],
# [ 1., 0., 0., 0.]], dtype=torch.float64)
您确实应该期望在大数据上工作的熊猫代码比在Python上迭代和压缩要快。 原因之一是Pandas / Numpy可以处理基础连续数据,而使用for循环则需要创建所有Python对象的开销。 您不会在配置文件中看到该数据,因为示例数据太小,因此这些措施主要是设置代码。
在进行时间分析时,您需要注意要精确地测量自己感兴趣的东西,并且测量结果是可重复的(不会淹没在噪音中)。
在这里,您的数据很少(只有5x5),而实际数据可能要大得多。
一些提示:
%timeit
进行测量以获得统计信息而不是嘈杂的测量 至于针对您问题的实际解决方案,熊猫无论如何都仅使用numpy表示数据。 您可以跳过熊猫,直接进入numpy:
zeros[rows, target] = 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.