相关疑难解决方法(0)

列表更改意外地反映在子列表中

我需要在Python中创建一个列表列表,所以我输入以下内容:

myList = [[1] * 4] * 3
Run Code Online (Sandbox Code Playgroud)

列表看起来像这样:

[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]  
Run Code Online (Sandbox Code Playgroud)

然后我改变了最里面的一个值:

myList[0][0] = 5
Run Code Online (Sandbox Code Playgroud)

现在我的列表看起来像这样:

[[5, 1, 1, 1], [5, 1, 1, 1], [5, 1, 1, 1]]  
Run Code Online (Sandbox Code Playgroud)

这不是我想要或期望的.有人可以解释一下发生了什么,以及如何解决这个问题?

python list mutable nested-lists

576
推荐指数
10
解决办法
3万
查看次数

在Python中为列表保留内存?

在使用Python编程时,是否可以为将填充已知数量的项目的列表保留内存,以便在构建列表时不会多次重新分配列表?我查看了文档中的Python列表类型,但没有找到任何似乎这样做的东西.但是,这种类型的列表构建显示在我的代码的几个热点中,所以我想尽可能高效.

编辑:另外,用像Python这样的语言做这样的事情是否有意义?我是一个相当有经验的程序员,但是对Python很陌生并且仍然对它的做事方式有所了解.Python是否在内部将所有对象分配到单独的堆空间中,从而无法尝试最小化分配,或者是直接存储在列表中的诸如整数,浮点数等原语?

python arrays performance memory-management list

44
推荐指数
4
解决办法
3万
查看次数

如何在Python中设置字典的初始大小?

我将大约400万个不同的密钥放入Python字典中.创建此字典大约需要15分钟,并且在我的计算机上占用大约4GB的内存.完全创建字典后,查询字典很快.

我怀疑字典创建是如此耗费资源,因为字典经常被重新定义(因为它大大增长).是否可以在Python中创建一个具有一些初始大小或桶号的字典?

我的字典从数字指向对象.

class MyObject(object):
  def __init__(self):
    # some fields...

d = {}
d[i] = MyObject()  # 4M times on different key...
Run Code Online (Sandbox Code Playgroud)

python performance dictionary

19
推荐指数
3
解决办法
2万
查看次数

是否有可能给python dict一个初始容量(并且它是有用的)

我正在填写一个包含大约10,000,000个项目的python dict.我对dict(或hashtables)的理解是,当有太多的元素进入它们时,需要调整大小,这个操作花费了相当长的时间.

有没有办法对python dict说你将至少存储n个项目,以便它可以从一开始就分配内存?或者这种优化对我的跑步速度没有任何好处?

(不,我没有检查过我的小脚本的缓慢是因为这个,我实际上现在不会怎么做.但是我会用Java做的,设置HashSet的初始容量吧)

python dictionary capacity

12
推荐指数
1
解决办法
7123
查看次数

Python相当于vector :: reserve()

我正在寻找C++ vector :: reserve()的Python等价物.我不知道列表提前有多大,但我知道它会相当大,我希望避免尽可能多的限制,因为列表是在一个内部循环中增长的.

到目前为止,我提出的唯一解决方案与vector :: reserve()习惯用法相比非常麻烦.该解决方案是使用[无]*K预先创建列表,在单独的计数器中跟踪列表的大小,根据需要将项目附加或设置到列表中,然后在完全构造后复制列表的一部分.还有其他选择吗?

c++ python

8
推荐指数
2
解决办法
2803
查看次数

Python:没有重定位的列表

我正在尝试用Python优化Python中的算法,纯粹是为了好玩/好奇.我有一个列表,我不断添加项目和删除项目.我知道Python列表的实现方式,Python将根据其大小为您重新定位内存中的列表.例如,如果你有一个包含10个成员的列表,那么10个指针将连续存储在内存中,但是可能没有100个连续指针的空间,因为另一个程序可能正在占用阻塞的内存块.因此,当您向列表中添加更多成员时,Python会将整个列表重新定位到内存中的不同位置,以便列表有更大的扩展空间.

我很想知道Python中是否有自定义数据结构,其行为类似于列表,但允许我避免执行重定位的性能成本.我期待该数据类型会问我,事先,我预见到有多少成员就会产生,然后它会在内存中分配大的连续空间,所以它不会需要重新安置的名单,因为它生长缓慢到我指定的成员数量.

(注:我尝试使用numpy的数组,但我必须保持一个单独的"针"变量保持列表的大小,恐怕维持该针在Python的开销成本比收获更多.)

python arrays optimization list

7
推荐指数
1
解决办法
146
查看次数

在 python 中预分配数组还是使用 arr.append() 更好?

在可读性和性能方面,我应该使用 为数组预分配内存吗[None]*n?分配一个空的[].append()反复使用是否算浪费?

python performance

7
推荐指数
1
解决办法
2644
查看次数

从list/dict中删除项后,Python"sys.getsizeof"会报告相同的大小吗?

我注意到当使用sys.getsizeof()来检查列表和字典的大小时,会发生一些有趣的事情.

我有:

a = [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

大小为56字节(空列表的大小为36,所以它有意义,因为20/5 = 4)

但是,在我删除列表中的所有项目后(使用.remove或del),大小仍为56.这对我来说很奇怪.大小不应该回到36?

任何解释?

python memory dictionary list

4
推荐指数
2
解决办法
873
查看次数

为字典预先分配内存?

在 python 3.4 中,我试图在一个大循环中填充一个字典,为其分配 30000 * 1000 个双数。我想预先为字典分配内存,这样我就可以减少每次迭代中分配内存带来的性能开销。

另外,如何检查Python中允许分配给字典(和列表)的内存大小限制?例如,如果只允许50MB,我会尽量避免溢出。这可能取决于操作系统和其他系统,但我想知道如何最大限度地提高性能。

我可以用

ll = [None] * 1000
Run Code Online (Sandbox Code Playgroud)

为列表分配内存。

字典有类似的方法吗?

d = {None} * 1000 ? 
or 
d = {None: None} * 1000 ? 
Run Code Online (Sandbox Code Playgroud)

谢谢

python dictionary python-3.x

4
推荐指数
1
解决办法
7529
查看次数