如果b是一个2×2的np.ndarray并且执行了下面的赋值,numpy会在后台做些什么,也就是说它会将列表[100,100] 第一个转换为numpy数组还是它直接使用列表[100,100],填补了值b的第一行:使用切片的numpy数组赋值
b[1,:] = [100,100]
的文档中哪里可以找到更多这方面的信息?
如果b是一个2×2的np.ndarray并且执行了下面的赋值,numpy会在后台做些什么,也就是说它会将列表[100,100] 第一个转换为numpy数组还是它直接使用列表[100,100],填补了值b的第一行:使用切片的numpy数组赋值
b[1,:] = [100,100]
的文档中哪里可以找到更多这方面的信息?
b[1,:] = [100,100]
是完全一样的
b[1,0] = 100
b[1,1] = 100
然而更快地执行,因为它使用编译循环。 (第二个需要在赋值之前对ndarray dtype进行转换)。
要评估执行速度,我们将使用timeit库。
import timeit
import numpy as np
setup = """
import numpy as np
tmp = np.empty(shape=(1, 100))
values = [i for i in xrange(100)]
"""
stmt1 = """tmp[0, :] = values"""
stmt2 = """
for i, val in enumerate(values):
tmp[0, i] = val
"""
time1 = timeit.Timer(setup=setup, stmt=stmt1)
time2 = timeit.Timer(setup=setup, stmt=stmt2)
print "numpy way :", time1.timeit(number=100000)
print "Python way:", time2.timeit(number=100000)
您可以测试这一点,你会发现,numpy的循环是快两倍:
- numpy way : 0.97758197784423828
- Python way: 2.1633858680725098
这是因为存在这样的情况在values
的整数(这是无限的整数)被转换成相64位浮点数。为了只比较循环的速度,类型转换可以预先在安装完成:
values = np.array([i for i in xrange(100)], dtype=np.float64)
这是我获得的:
numpy way : 0.131125926971
Python way: 2.64055013657
我们注意到,numpy的循环是20倍比Python循环更快。
你会发现更多的信息'numpy'是开源的,如果你有兴趣在如何的东西是* *实现单看来源。 – Bakuriu
答案是“视情况而定”。查看Numpy发行版中的'core/src/multiarray/sequence.c'('array_assign_slice':https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/sequence.c#L91 )。在你的例子中,我认为代码不会将列表转换为数组,但根据其他情况,它可能会。 –
@goncalopp是的,我关心内存使用情况。 – methane