gpt4 book ai didi

python - 对单个列求和的最快方法

转载 作者:太空宇宙 更新时间:2023-11-04 03:42:11 25 4
gpt4 key购买 nike

我正在寻找优化我编写的程序的方法,但我确实遇到了一些绊脚石。我有很多问题,我不知道从哪里开始,但对于初学者来说,我会尽量将其简化为一个我似乎无法克服的障碍。

我正在编写的代码是一个小型计划生成器,用于需要 24/7 覆盖的工作。每个类次涵盖两周的时间跨度(有些类次轮换两周,但必须保持覆盖要求 - 这就是为什么我必须使用 14 天)。截至目前,我正在尝试找出最快的方法来检查轮类的组合是否在给定的一天增加了正确的人数。我一直听说 Numpy 在处理这类事情时速度超快,但是当我运行以下命令时:

import numpy as np
import time

c_ar = np.array([1,1,1,1,0,0,0,1,1,1,1,0,0,0])
d_ar = np.array([0,0,0,1,1,1,1,0,0,0,1,1,1,1])
e_ar = np.array([0,0,0,1,1,1,1,0,0,0,1,1,1,1])
m_ar = np.array([0,1,1,0,1,1,0,0,1,1,0,1,1,0])
p_ar = np.array([1,1,0,0,0,1,1,1,1,0,0,0,1,1])

t0 = time.time()
x = c_ar[0] + d_ar[0] + e_ar[0] + m_ar[0] + p_ar[0]
t1 = time.time()
print t1-t0

我回来了:

2.19345092773e-05

但是,如果我运行:

c = [1,1,1,1,0,0,0,1,1,1,1,0,0,0]
d = [0,0,0,1,1,1,1,0,0,0,1,1,1,1]
e = [0,0,0,1,1,1,1,0,0,0,1,1,1,1]
m = [0,1,1,0,1,1,0,0,1,1,0,1,1,0]
p = [1,1,0,0,0,1,1,1,1,0,0,0,1,1]

t2 = time.time()
y = c[0] + d[0] + e[0] + m[0] + p[0]
t3 = time.time()
print t3-t2

我回来了:

1.90734863281e-06

我是否遗漏了一些有关 Numpy 的东西,使其比我的示例更快?另外,有没有比我上面使用的两种方法更快的方法?

最佳答案

将所有数据放入一个 NumPy 数组中,然后调用 numpy.sum 一次:

arr.sum(axis=0)

当您使用 NumPy 数组来逐项访问各个值时,NumPy 数组并不比常规 Python 代码快,就像这里所做的那样:

c_ar[0] + d_ar[0] + e_ar[0] + m_ar[0] + p_ar[0]

此外,对于数组,这种小型的常规 Python 代码可能比使用 NumPy 数组更快:

c = [1,1,1,1,0,0,0,1,1,1,1,0,0,0]
d = [0,0,0,1,1,1,1,0,0,0,1,1,1,1]
e = [0,0,0,1,1,1,1,0,0,0,1,1,1,1]
m = [0,1,1,0,1,1,0,0,1,1,0,1,1,0]
p = [1,1,0,0,0,1,1,1,1,0,0,0,1,1]
arr = np.row_stack([c,d,e,m,p])

In [226]: %timeit c[0] + d[0] + e[0] + m[0] + p[0]
10000000 loops, best of 3: 189 ns per loop

In [231]: %timeit arr[:,0].sum()
100000 loops, best of 3: 4.73 µs per loop

In [239]: %timeit [c[i] + d[i] + e[i] + m[i] + p[i] for i in range(len(c))]
100000 loops, best of 3: 3.68 µs per loop

In [240]: %timeit arr.sum(axis=0)
100000 loops, best of 3: 5.04 µs per loop

关于python - 对单个列求和的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25828035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com