我正在尝试将一个简单的计算,目前在一个
除此之外,我似乎无法将各种需要使用
注意:这里有一个较旧的答案here,建议在Python中进行字符串操作,但它没有比较运行时间,也可能已经过时。
我的尝试比较:
for
循环中,推入一个numpy
数组。在这种情况下,它是对一个字符串列表进行的计算,形式如下:
strings = ['12,34','56,78'...]
通过逗号分隔符拆分字符串并生成两个整数,例如
strings = [[12, 34],[56, 78]...]
过滤嵌套列表,仅保留那些符合某些任意条件的成员,例如子列表中的两个数字都在特定范围内。
numpy
库,但我无法利用提高的计算速度,而不增加处理初始列表的开销。例如,我的直觉是在创建数组之前在Python中执行split()
和int()
转换,但这比简单的for
循环更昂贵。除此之外,我似乎无法将各种需要使用
numpy
操作的数组拼接起来,以从初始列表中创建的数组中完成此操作。是否有合理的方法来做这件事,或者对于仅使用一次的数组之类的东西,这是一个不可挽回的事情?注意:这里有一个较旧的答案here,建议在Python中进行字符串操作,但它没有比较运行时间,也可能已经过时。
我的尝试比较:
import random
import datetime as dt
import numpy as np
raw_locs = [str(random.randint(1,100)) + ',' + str(random.randint(1,100))
for x in xrange(100000)]
if __name__ =='__main__':
# Python approach
start1 = dt.datetime.now()
results = []
for point in raw_locs:
lon, lat = point.split(",")
lat = int(lat)
lon = int(lon)
if 0 <= lon <= 50 and 50 <= lat <= 100:
results.append(point)
end1 = dt.datetime.now()
# Python list comprehension prior to numpy array
start2 = dt.datetime.now()
converted_list = [map(int, item.split(',')) for item in raw_locs]
end2 = dt.datetime.now()
# List comprehension + numpy array creation
start3 = dt.datetime.now()
arr = np.array([map(int, item.split(',')) for item in raw_locs])
end3 = dt.datetime.now()
start4 = dt.datetime.now()
results2 = arr[((0 <= arr[:,0]) & (arr[:,0] <= 50)
& (50 <= arr[:,1]) & (arr[:,1] <= 100))]
end4 = dt.datetime.now()
# Print results
print "Pure python for whole solution took: {}".format(end1 - start1)
print "Just python list comprehension prior to array took: {}".format(end2 - start2)
print "Comprehension + array creation took: {}".format(end3 - start3)
print "Numpy actual calculation took: {}".format(end4 - start4)
print "Total numpy time: {}".format(end4 - start3)
if
检查占运行时间的约26%,因此可能快几个数量级)。 - roganjoshtimeit
可能更有用。让我看看它在我的端上显示了什么。 - Andras Deak -- Слава Україні