繁体   English   中英

Python的循环速度比Pandas快

[英]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),而实际数据可能要大得多。

一些提示:

  • 不要测量设置代码(例如创建pandas对象,可能只完成一次)
  • 使用iPython %timeit进行测量以获得统计信息而不是嘈杂的测量
  • 用足够大的数据进行测量,以查看所测量的差异。 无需优化5x5矩阵上的运算

至于针对您问题的实际解决方案,熊猫无论如何都仅使用numpy表示数据。 您可以跳过熊猫,直接进入numpy:

zeros[rows, target] = 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM