填充阵列的最快方法?

2024-06-16 09:33:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我想填充一个大小为n的数组(一个非常大的数组):

1 for i = 1, (n/2)+1
^{pr2}$ ^{3}$

是遍历0到n并对每个语句使用if语句和%的最快方法吗?在

像这样:

array = []
for index in range(1,n):
    if index == 1 or (index % ((n/2)+1) == 0):
        array.append(1)
    if index == 2 or index == 3 or (index % (n/2) == 0):
        array.append(2)
    if (index % ((n/2)+2) == 0):
        array.append(0)

我试着想其他办法来做这件事,但我没有想出任何办法。我不是一个程序员的行业,但我不确定我将如何实现这一点。在


Tags: or方法inforindexifrange数组
3条回答

构造这样一个集合的最有效方法是使用numpy数组。在

我们可以用以下方法构建:

import numpy as np

def generate_array(n):
    a = np.hstack((np.full(n//2+1, 2), np.zeros(n//2-1)))
    a[[0, n//2]] = 1
    return a

例如:

^{pr2}$

计时

对于n=100_000,我们得到:

>>> timeit(partial(generate_array, 100_000), number=10_000)
1.0764452270013862

对于n=1_000_000,我们得到:

>>> timeit(partial(generate_array, 1_000_000), number=1_000)
6.448311180000019

生成100k个元素的数组,因此大约需要(包括partial等的小开销)107.64µs,生成1M元素的数组需要6448.31µs。在

因为其他答案都是和numpy数组一起使用的,速度非常快,为了完整起见,我想添加一些其他答案。(在最初的问题中,如果n是奇数怎么办,以及作者期望的是从零开始还是从一开始的索引,这显然有些模糊。)

你可以很简单地使用列表理解来创建一个列表

[1 if i in [0, n/2] else (2 if i <=(n/2) else 0) for i in range(0, n)]

但是更快的方法是通过扩展类来扩展列表的功能:

^{pr2}$

您可以调用整个列表,也可以只调用单个元素。创建整个列表仍然很慢。在

您可能需要使用numpy来完成此操作。您可以使用^{}连接多个切片,并使用它们对数组进行切片分配:

import numpy as np

n = 10
a = np.zeros(n)
a[np.r_[0,n//2]] = 1
a[np.r_[1:n//2]] = 2
a[np.r_[n//2+1:n]] = 0

print(a)
array([1., 2., 2., 2., 2., 1., 0., 0., 0., 0.])

相关问题 更多 >