- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以我经常按照这样的模式编写代码:
_list = list(range(10)) # Or whatever
_list = [some_function(x) for x in _list]
_list = [some_other_function(x) for x in _list]
_list[:] = [some_function(x) for x in _list]
def some_function(number: int):
return number*10
def main():
_list1 = list(range(10))
_list2 = list(range(10))
a = _list1
b = _list2
_list1 = [some_function(x) for x in _list1]
_list2[:] = [some_function(x) for x in _list2]
print(f"list a: {a}")
print(f"list b: {b}")
if __name__=="__main__":
main()
list a: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
list b: [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
from memory_profiler import profile
def normalise_number(number: int):
return number%1000
def change_to_string(number: int):
return "Number as a string: " + str(number) + "something" * number
def average_word_length(string: str):
return len(string)/len(string.split())
@profile(precision=8)
def mutate_list(_list):
_list[:] = [normalise_number(x) for x in _list]
_list[:] = [change_to_string(x) for x in _list]
_list[:] = [average_word_length(x) for x in _list]
@profile(precision=8)
def replace_list(_list):
_list = [normalise_number(x) for x in _list]
_list = [change_to_string(x) for x in _list]
_list = [average_word_length(x) for x in _list]
return _list
def main():
_list1 = list(range(1000))
mutate_list(_list1)
_list2 = list(range(1000))
_list2 = replace_list(_list2)
if __name__ == "__main__":
main()
Line # Mem usage Increment Line Contents
================================================
16 32.17968750 MiB 32.17968750 MiB @profile(precision=8)
17 def mutate_list(_list):
18 32.17968750 MiB 0.00000000 MiB _list[:] = [normalise_number(x) for x in _list]
19 39.01953125 MiB 0.25781250 MiB _list[:] = [change_to_string(x) for x in _list]
20 39.01953125 MiB 0.00000000 MiB _list[:] = [average_word_length(x) for x in _list]
Filename: temp2.py
Line # Mem usage Increment Line Contents
================================================
23 32.42187500 MiB 32.42187500 MiB @profile(precision=8)
24 def replace_list(_list):
25 32.42187500 MiB 0.00000000 MiB _list = [normalise_number(x) for x in _list]
26 39.11328125 MiB 0.25781250 MiB _list = [change_to_string(x) for x in _list]
27 39.11328125 MiB 0.00000000 MiB _list = [average_word_length(x) for x in _list]
28 32.46484375 MiB 0.00000000 MiB return _list
最佳答案
很难规范地回答这个问题,因为实际细节是依赖于实现的,甚至是依赖于类型的。
例如在 CPython 当一个对象达到引用计数为零时,它就会被处理掉并立即释放内存。然而,有些类型有一个额外的“池”,它在你不知道的情况下引用实例。例如,CPython 有一个未使用的“池”list
实例。当最后引用一个 list
在 Python 代码中删除它 5 月 被添加到这个“空闲列表”而不是释放内存(需要调用一些东西 PyList_ClearFreeList
来回收该内存)。
但是列表不仅仅是列表所需的内存,一个列表包含 对象。即使当列表的内存被回收时,列表中的对象仍然可以保留,例如,在其他地方仍然存在对该对象的引用,或者该类型本身也有一个“空闲列表”。
如果您查看其他实现,例如 PyPy 那么即使没有“池”,当没有人再引用它时,对象也不会立即处理,它只会“最终”处理。
那么这与您可能想知道的示例有何关系。
让我们来看看你的例子:
_list = [some_function(x) for x in _list]
_list
的列表实例。 .然后你创建一个
新名单使用列表理解并将其分配给名称
_list
.在此分配之前不久,内存中有两个列表。旧列表和由理解创建的列表。在分配之后,有一个名称引用的列表
_list
(新列表)和一个引用计数减 1 的列表。如果旧列表没有在其他任何地方被引用并因此达到 0 的引用计数,它可能会返回到池中,它可能是处置或可能最终处置。旧列表的内容相同。
_list[:] = [some_function(x) for x in _list]
_list
分配了一个列表。 .当该行执行时,它还会通过列表理解创建一个新列表。但不是将新列表分配给名称
_list
它将用新列表的内容替换旧列表的内容。然而,当它清除旧列表时,它会有
两个保存在内存中的列表。在此分配之后,旧列表仍可通过名称
_list
获得。但是列表理解创建的列表不再被引用,它的引用计数为 0 并且会发生什么取决于它。它可以放入空闲列表的“池”中,可以立即处理,也可以在将来某个未知时间点处理。清除旧列表的原始内容也是如此。
_list = list(range(10)) # Or whatever
_list = [some_function(x) for x in _list]
_list = [some_other_function(x) for x in _list]
def generate_values(it):
for x in it:
x = some_function(x)
x = some_other_function(x)
yield x
for item in generate_values(range(10)):
print(item)
list(generate_values(range(10)))
list
)创建任何列表。生成器是一种状态机,可在请求时一次处理一个元素。
关于突变和重新分配列表之间的 Python 区别(列表 = 和列表 [:] = ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56308475/
我想用 Graphite 烯一口气创造很多人。 文档只提到了这样创建一个人的方法: class CreatePerson(graphene.Mutation): class Input: na
我想发送没有子部分的 graphql 突变请求 mutation _ { updateCurrentUser(fullName: "Syava", email: "fake@gmail.com
通常查询是在您获取数据时,而变异是在您操作数据时。但是我将如何在没有任何参数的情况下实现突变? 在我的特殊情况下,我删除并创建了 2fa token 端点。 delete 和 create token
我正在使用 REDUX-TOOLKIT-QUERY,现在我有一种情况,我必须调用一个突变。一旦该突变返回响应,我必须在其他三个突变中使用该响应作为请求参数。我们如何才能以正确的方式实现它? const
突变是用于操作数据的查询。如果是这样,那么我的 root query和 root mutation树应该看起来相似吧?他们都应该允许嵌套字段(嵌套突变)。我正在玩这个(使用 express-graph
使用 R 3.6.1 (64) 位。使用 readxl 将数据框导入 R(命名为“RawShift”。我创建了 6 个变量(类:“字符”),它们是用户名列表。每个列表都以用户所在的团队命名。 我想使用
我正在尝试将 dplyr 中的 mutate 与动态变量名称一起使用。我发现了一些关于 SO(here、here 和 here)的帖子,它们让我更接近但不是可行的解决方案。我不认为缺少什么,但我需要你
我有一个现有的代码库,它使用 Meteor 方法接收来自客户端的请求并在服务器上执行数据库操作。我想尝试将此项目转移到 GraphQL,但我无法理解该工作的范围,特别是这对这些 Meteor 方法意味
我正在使用 Apollo Client 并尝试构建一个提交对象的突变,该对象的一部分是子类型的数组,该数组的大小需要是动态的,但我找不到任何有关如何正确构建此数组的文档。 这是我使用手动输入的数组进行
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我的应用程序的目标是让用户能够保存和调用要填写和编辑的表单列表。一个用户会有多个表单,一个表单将由它自己的几个字段组成。 如果我的类型是这样设置的,例如: const FormType = new G
我刚刚写完这段代码: /// Watcher to look for changes in files pub struct Watch { glob:Option, ruv:Vec, p
我做了这个: test 1 为什么.b没有激活警报? $( ".a" ).click(function() { $('div').html('test 2'); }); $( ".b" ).click
我使用 graphene-django 来获得 GrapQL API。我在我的 schema.py 中创建了一个突变: class UpdateApplication(graphene.Mutatio
我正在使用适用于 Android 的 graphql apollo 客户端。我能够使用单个字段的突变传递数据而没有任何问题。在突变中使用输入对象时,发生错误无法读取未定义的电子邮件属性。但同样的 gr
我有两个变量,一个是可变数组,另一个是不可变的。 let mutableArray = NSMutableArray(array: ["1","2","3"]) let immutableArray:
是否可以从一个突变中对另一个 graphqlType 运行一个突变?我不确定这是否是个好主意。理想情况下,最好为每种 graphql 数据类型创建突变,然后在需要时调用这些函数中的每一个。希望这能让事
我需要能够在单个请求中创建一个用户并添加它最喜欢的电影(一个对象数组,引用了 Movies 集合和他对每部电影的个人评分)。 看起来像这样的东西(伪代码) var exSchema = ` type
我一直在使用 graphql-js 的 Node 服务器中使用 GraphQL,并且 GraphQL 已被证明是一个非常有值(value)的抽象,但我遇到了一个问题。 我经常发现自己需要使用 Grap
对于任何使用过 VuexFire Vuex v2 的人。 mutations: VuexFire.mutations 这里指的是什么?答案可能很明显,但我不知道这意味着什么。那么我的实际突变去哪里了?
我是一名优秀的程序员,十分优秀!