Python代码的优化
我有一个小函数(见下文),它返回从整数列表(例如[1,2,3,4])映射而来的名称列表,整数列表的长度可以达到1000 这个函数一次可能被调用数万次,我想知道我是否能做些什么使它运行得更快Python代码的优化,python,list,optimization,hash,set,Python,List,Optimization,Hash,Set,我有一个小函数(见下文),它返回从整数列表(例如[1,2,3,4])映射而来的名称列表,整数列表的长度可以达到1000 这个函数一次可能被调用数万次,我想知道我是否能做些什么使它运行得更快 graph\u hash是一个大型散列,它将键映射到长度小于等于1000的集合。我在一个集合上迭代,将值映射到名称并返回一个列表。u.get\u name\u from\u id()查询sqlite数据库 有什么想法可以优化此功能的任何部分吗 def get_neighbors(pid): names
graph\u hash
是一个大型散列,它将键映射到长度小于等于1000的集合。我在一个集合上迭代,将值映射到名称并返回一个列表。u.get\u name\u from\u id()
查询sqlite
数据库
有什么想法可以优化此功能的任何部分吗
def get_neighbors(pid):
names = []
for p in graph_hash[pid]:
names.append(u.get_name_from_id(p))
return names
如果你要做成千上万的附录,我建议使用
deque
而不是list
。因此,names
应该是names=deque()。因此,names
应该是names=deque()
for p in graph_hash[pid]:
names.append(u.get_name_from_id(p))
我建议同时使用线程来执行。像这样的事情应该让你开始:
def load_stuff(queue, p):
q.put(u.get_name_from_id(p))
def get_neighbors(pid):
names = Queue.Queue()
# we'll keep track of the threads with this list
threads = []
for p in graph_hash[pid]:
thread = threading.Thread(target=load_stuff, args=(names,p))
threads.append(thread)
# start the thread
thread.start()
# wait for them to finish before you return your Queue
for thread in threads:
thread.join()
return names
如果需要,您可以将队列
转换回带有[名称中项目的项目。队列]
的列表
其思想是数据库调用在完成之前一直处于阻塞状态,但是您可以在数据库上执行多个SELECT
语句,而无需锁定。因此,您应该使用线程或其他并发方法来避免不必要的等待。您在这里按顺序访问数据库:
for p in graph_hash[pid]:
names.append(u.get_name_from_id(p))
我建议同时使用线程来执行。像这样的事情应该让你开始:
def load_stuff(queue, p):
q.put(u.get_name_from_id(p))
def get_neighbors(pid):
names = Queue.Queue()
# we'll keep track of the threads with this list
threads = []
for p in graph_hash[pid]:
thread = threading.Thread(target=load_stuff, args=(names,p))
threads.append(thread)
# start the thread
thread.start()
# wait for them to finish before you return your Queue
for thread in threads:
thread.join()
return names
如果需要,您可以将队列
转换回带有[名称中项目的项目。队列]
的列表
其思想是数据库调用在完成之前一直处于阻塞状态,但是您可以在数据库上执行多个SELECT
语句,而无需锁定。因此,您应该使用线程或其他一些并发方法来避免不必要的等待。缓存和多线程只是到目前为止,您应该创建一个新方法,在后台使用executemany
从数据库批量检索多个名称
类似于names=u.get\u names\u from\u ids(graph\u hash[pid])
缓存和多线程只会让您走到目前为止,您应该创建一个新方法,在引擎盖下使用executemany
从数据库批量检索多个名称
类似于names=u.get\u names\u from\u id(graph\u hash[pid])
列表理解是一个开始(类似于@cricket\u 007的生成器建议),但您受到函数调用的限制:
def get_neighbors(pid):
return [u.get_name_from_id(p) for p in graph_hash[pid]]
> @ SalayDead建议,考虑加快<代码> GETYNAMEYOFAX IDE()/<代码>
< P>列表理解是一个开始(类似于@ CRKETETYO700的生成器建议),但您受函数调用限制:
def get_neighbors(pid):
return [u.get_name_from_id(p) for p in graph_hash[pid]]
> @ SalayDead建议,考虑加快<代码> GETYNAMEYOFAX IDE()/<代码> .< /P>,您可以使它成为生成器,尽管这将只会推到调用函数缓存的瓶颈,尽可能多的<代码> GETBIOLION/<代码>和<代码> U.GETYNAMEYOFAXIDID>代码>您可以在[SET]中构造[X代码],其中X在[SET中的所有项目]中
子句,只需对每个pid
进行一次dB查询即可???如果您可以并且get\u name\u from\u id
返回一个列表,那么使用names.extend(..)
您可以将其作为一个生成器,尽管这只会将瓶颈推到调用函数缓存上,尽可能多地get\u neighbories
和u.get\u name\u from\u id
您可以构造一个其中x在[集合中的所有项]
子句,只需对每个pid
进行一次dB查询即可???如果可以并且get\u name\u from\u id
返回一个列表,请使用names.extend(..)
这是不对的-Python中的列表经过优化,可以有效地处理append()
操作。没有创建新列表,只是在末尾添加元素。根据:“在内部,列表被表示为一个数组;最大的成本来自于超出当前分配大小的增长(因为所有内容都必须移动),或者在开始附近的某个位置插入或删除(因为之后的所有内容都必须移动)如果您需要在两端添加/删除,请考虑使用Calths.DeQue.“”这里的关键部分是“两端”。当添加到列表时,情况并非如此,我们在最高效的一端添加元素。(无论如何,如果在初始容量之外添加元素,deque
也必须增长)这是不对的-Python中的列表经过优化,可以有效地处理append()
操作。没有创建新列表,只是在末尾添加元素。根据:“在内部,列表被表示为一个数组;最大的成本来自于超出当前分配大小的增长(因为所有内容都必须移动),或者在开始附近的某个位置插入或删除(因为之后的所有内容都必须移动)如果您需要在两端添加/删除,请考虑使用Calths.DeQue.“”这里的关键部分是“两端”。当添加到列表时,情况并非如此,我们在最高效的一端添加元素。(无论如何,如果在初始容量之外添加元素,deque
也必须增长)