下面的代码将显示使用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
答案 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),而你的实际数据可能要大得多。
一些提示:
%timeit
进行衡量以获取统计信息,而不是噪音测量至于你问题的实用解决方案,pandas无论如何只使用numpy来表示数据。你可以跳过pandas并直接进入numpy:
zeros[rows, target] = 1