Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python代码的优化_Python_List_Optimization_Hash_Set - Fatal编程技术网

Python代码的优化

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

我有一个小函数(见下文),它返回从整数列表(例如[1,2,3,4])映射而来的名称列表,整数列表的长度可以达到1000

这个函数一次可能被调用数万次,我想知道我是否能做些什么使它运行得更快

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
也必须增长)