最近我正在调试如下代码
def getList():
#query db and return a list
total_list = Model.objects.all()
result = list()
for item in total_list:
if item.attr1:
result.append(item)
return result
# in main code
org_list = getList()
list = orgList[:]#this line cause cpu problems.
if len(org_list)>0 and org_list[0].is_special:
my_item = org_list[0]
for i in list:
print_item(i)
doSomethingelse(list[0])
为了简化代码,我更改了大部分代码,但主要部分在这里。
在 getList 方法中,我们查询数据库并获取 20~30 行。然后我们从中创建一个 python 列表并返回它。 在 main 方法中,我们从 getList 方法获取 org_list 变量 并用 orgList[:] 对其进行切片
并循环此列表并调用其上的特定元素,例如 list[0]
这里的问题是,这段代码运行在一个非常繁忙的服务器上,不幸的是它使用了大部分CPU并最终锁定了我们的服务器。 这里的问题是我们用 list[:] 切片 list varibale 的行 如果我们不这样做而只使用 org_list 变量,我们的服务器就不会出现问题。有没有人知道为什么会发生这种情况。切片会占用大量 cpu 或当我们使用切片列表时。它使用大量CPU吗?
最佳答案
您显示的代码将在引发异常所需的 0.1 微秒内运行:
org_list = getList()
list = orgList[:]#this line cause cpu problems.
orgList
应为 org_list
。显示实际重现问题的最少代码。
此外,这还会终止 list
内置函数。不要这样做。
更新另一个想法:对“我的 Django 应用程序运行缓慢!”的常见 react 是“关闭调试标志”...显然它不会在 Debug模式下释放内存。
更新2关于“”“我发现当你对列表进行切片时。它实际上充当该列表的 View ,只需调用原始列表方法即可获取实际项目。”“”在哪里你明白了吗?普通的旧列表不可能是这种情况!您是否在某处重新定义了 list
?
在您的 getList
函数中:
(1) 输入打印类型(列表)
(2) 将 result = list()
替换为 result = []
并查看问题是否消失。
关于python - l[ :] performance problem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4763708/