Python循环比Pandas快

时间:2018-06-11 09:30:41

标签: python pandas pytorch

下面的代码将显示使用python循环比使用Pandas更快。在我测试之前我的理解是不同的。所以我想知道我是否错误地使用熊猫进行此操作? 以下代码显示Pandas解决方案大约慢7倍:

Uncaught (in promise) Error: Module parse failed: C:\Users\....\target.html Unexpected token (1:0) You may need an appropriate loader to handle this file type. 
| <!DOCTYPE html> 
| <html xmlns="w3.org/1999/xhtml">; 
| <head><title>

代码:

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

2 个答案:

答案 0 :(得分:2)

根据您的使用情况,通过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)

答案 1 :(得分:1)

你确实应该期望适用于大数据的pandas代码比迭代它并使用Python压缩更快。其中一个原因是Pandas / Numpy可以处理底层连续数据,而使用for循环则会产生创建所有Python对象的开销。您在分析中没有看到,因为您的示例数据太小,因此这些措施主要是设置代码。

在进行时间分析时,您需要注意您正在测量您感兴趣的内容,并且您的措施是可重复的(不会淹没在噪音中)。

这里你的数据非常少(只有5x5),而你的实际数据可能要大得多。

一些提示:

  • 不要测量设置代码(比如创建pandas对象,可能只做一次)
  • 使用iPython %timeit进行衡量以获取统计信息,而不是噪音测量
  • 使用足够大的数据进行测量,以查看您测量的内容的差异。没有必要优化5x5矩阵的操作

至于你问题的实用解决方案,pandas无论如何只使用numpy来表示数据。你可以跳过pandas并直接进入numpy:

zeros[rows, target] = 1