有没有办法按其主要索引对列表进行切片?
Is there a way to slice a list by its prime indices?
让
a = [1, 2, ... 99, 100] # numbers 1 to 100
b = [2, 3, ... 89, 97] # prime numbers under 100
是否有一种 Pythonic 的方式将 a
分割成 b
?
即
a[b]
输出将是
[3, 4, ... 90, 98]
怎么样:
result = [a[i] for i in b]
因为有numpy标签:
import numpy as np
a = np.array(a)
b = np.array(b)
result = a[b]
时间性能比较:
import numpy as np
N=100_000
a = list(range(N))
b = list(range(1, N, 3))
c = np.array(a)
d = np.array(b)
列表理解
%timeit [a[i] for i in b]
2.31 ms ± 456 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Numpy
%timeit c[d]
115 µs ± 7.57 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
使用一个简单的测试,我们可以看到 numpy 使用长度数组快 20 倍 100_000,但这不是一个公平的比较,因为我没有考虑导入库和转换的时间列表到数组。
最后一点,实际上没有必要也将 b
转换为 numpy 数组。
让
a = [1, 2, ... 99, 100] # numbers 1 to 100
b = [2, 3, ... 89, 97] # prime numbers under 100
是否有一种 Pythonic 的方式将 a
分割成 b
?
即
a[b]
输出将是
[3, 4, ... 90, 98]
怎么样:
result = [a[i] for i in b]
因为有numpy标签:
import numpy as np
a = np.array(a)
b = np.array(b)
result = a[b]
时间性能比较:
import numpy as np
N=100_000
a = list(range(N))
b = list(range(1, N, 3))
c = np.array(a)
d = np.array(b)
列表理解
%timeit [a[i] for i in b]
2.31 ms ± 456 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Numpy
%timeit c[d]
115 µs ± 7.57 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
使用一个简单的测试,我们可以看到 numpy 使用长度数组快 20 倍 100_000,但这不是一个公平的比较,因为我没有考虑导入库和转换的时间列表到数组。
最后一点,实际上没有必要也将 b
转换为 numpy 数组。