我沿着一条直线移动一个粒子,然后用N来除这个轨迹,N是一个很大的数,然后我根据它的位置进行一些计算,并把这些计算结果存储在7个不同的列表中,整个过程大约需要0.03秒,这是很棒的。
但是,使用这些列表,我创建了差异列表,其中d_list的元素对于所有n都是list[n+1]-list[n]。
d_lists = [[np.abs(b-a) for a,b in zip(l, l[1:])] for l in lists]
当我这样做的时候,现在需要7.7秒,这比0.03秒要高得多。我试着减少时间,但是花了大约13秒。
d_lists = [[abs_diff for abs_diff in map(np.abs, zip(l, l[1:]))]
我很好奇是否有更好的方法来解决这个问题。我很难直观地理解为什么这个简单的任务要花很多时间。
我注意到的一件事是np.abs引起的,如果我用(b-a)代替np.abs(b-a),那么7.7秒会减少到1.2秒。
2条答案
按热度按时间zpjtge221#
您可以在
numpy
中使用diff
和abs
完全完成此操作:这将给予一个数组,您可以使用以下命令将其转换回列表的列表(如果需要
nbnkbykc2#
您是否尝试过
np.diff
?这就给了你数组中的连续差异,而不需要你当前的过程,即从一个标准的python结果b-a转换每个元组(a,B),然后运行一个numpy函数。
列表本身可以是numpy数组吗?
这可能会使它更快,Python本地变量与NumPy之间的每一次转换都可能会产生一点开销,而在当前的情况下,这种开销会被大量重复。
为了获得最大效率,您可以将所有列表存储在一个 single numpy数组中
我认为这是可能的,因为你似乎在说这7个列表实际上是平行的,即它们的长度相等。
如果是这样的话,那么你可以使用
np.diff
并指定你想要它沿着哪个“轴”进行比较。https://numpy.org/doc/stable/reference/generated/numpy.diff.html