【发布时间】:2020-07-19 00:58:01
【问题描述】:
我在使用 python 编码时遇到了性能问题。 假设我有 2 个非常大的字符串数组 (Nx2),N = 12,000,000,还有两个变量 label_a 和 label_b,它们也是字符串。下面是代码:
import numpy as np
import time
indices = np.array([np.random.choice(np.arange(5000).astype(str),size=10000000),np.random.choice(np.arange(5000).astype(str),size=10000000)]).T
costs = np.random.uniform(size=10000000)
label_a = '2'
label_b = '9'
t0 = time.time()
costs = costs[(indices[:,0]!=label_a)*(indices[:,0]!=label_b)*(indices[:,1]!=label_a)*(indices[:,1]!=label_b)]
indices = indices[(indices[:,0]!=label_a)*(indices[:,0]!=label_b)*(indices[:,1]!=label_a)*(indices[:,1]!=label_b)]
t1 = time.time()
toseq = t1-t0
print(toseq)
上面的代码段每次运行需要 3 秒。我想在降低计算成本的同时实现同样的目标: 我使用布尔掩码仅检索成本和索引数组中值不是 label_a 和 label_b 的行
【问题讨论】:
-
您能否提供一些
costs、indices、indix、cost_、label_a和label_b的示例数据?它不一定要按比例缩放(因此,不是 1200 万个项目),而只是一些可以让您了解数据类型并表明您的代码确实有效。理想情况下,只需在代码示例的开头添加一些声明,以便它作为一个整体工作。 -
idx=np.nonzero(indices...)和costs[idx]可能会缩短时间。 -
@Grismar 完成。谢谢,我也在考虑。
-
@hpaulj 我相信这让情况稍微好一些,我的机器上的两条感兴趣的线从 2.6 秒变为 1.6 秒。这个很棒,我会暂时使用它。我仍然希望可能达到亚秒级甚至更长时间。
-
您可能还希望分别对 mask/idx 创建步骤和实际索引步骤进行计时。我不记得过去的测试中索引时间是否取决于所取值的比例(尽管这很容易测试)。如果 mask creationg 占主导地位,您可能需要专注于提高效率。
标签: python performance numpy boolean masking