小编Den*_*niz的帖子

有没有办法绕过Python list.append()随着列表的增长逐渐变慢?

我有一个大文件,我正在读取,并将每几行转换为一个对象的实例.

由于我循环遍历文件,因此我使用list.append(instance)将实例存储到列表中,然后继续循环.

这是一个约100MB左右的文件,因此它不会太大,但随着列表变大,循环逐渐减慢.(我打印循环中每圈的时间).

这不是循环所固有的〜当我循环浏览文件时打印每个新实例时,程序以恒定速度进行〜只有当我将它们附加到列表时才会变慢.

我的朋友建议在while循环之前禁用垃圾收集,然后启用它并进行垃圾收集调用.

有没有其他人观察到list.append变慢的类似问题?有没有其他方法来规避这个?


我将尝试以下两个建议.

(1)"预先分配"记忆〜这样做的最佳方法是什么?(2)尝试使用deque

多个帖子(请参阅Alex Martelli的评论)建议内存碎片化(他有像我这样的大量可用内存)〜但没有明显的性能修复.

要复制这种现象,请运行下面答案中提供的测试代码,并假设这些列表包含有用的数据.


gc.disable()和gc.enable()有助于计时.我还会仔细分析所有时间花在哪里.

python performance class list append

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

在Python中创建一个列表,在一行中包含给定对象的多个副本

假设我有一个给定的对象(一个字符串"a",一个数字 - 让我们说0,或者一个列表['x','y'])

我想创建包含此对象的许多副本的列表,但不使用for循环:

L = ["a", "a", ... , "a", "a"]

要么

L = [0, 0, ... , 0, 0]

要么

L = [['x','y'],['x','y'], ... ,['x','y'],['x','y']]

我对第三种情况特别感兴趣.谢谢!

python list

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

C++如何将已排序的向量合并到一个已排序的向量/弹出所有这些向量中的最小元素?

我有一个大约一百个排序的集合vector<int>虽然大多数向量中都有少量整数,但是一些向量包含大量(> 10K)它们(因此向量不一定具有相同的大小) ).

我想要做的基本上是遍历从最小到最大的整数,它们包含在所有这些排序的向量中.

一种方法是将所有这些排序的向量合并到一个有序向量中并简单地迭代.从而,

问题1:将排序后的向量合并为有序向量的最快方法是什么?

另一方面,我确信有更快/更聪明的方法来实现这一点,而无需合并和重新排序整个事物 - 也许从这个排序向量集合中迭代地弹出最小的整数; 没有合并它们..所以:

问题2:从一堆排序中弹出最少元素的禁区/最佳方法vector<int>是什么?


基于下面的回复,以及对问题的评论,我已经实现了一种方法,我为排序的向量建立了迭代器的优先级队列.我不确定这是否具有性能效率,但它似乎非常节省内存.我认为问题仍然存在,因为我不确定我们是否已经建立了最快的方式.

// compare vector pointers by integers pointed
struct cmp_seeds {
    bool operator () (const pair< vector<int>::iterator, vector<int>::iterator> p1, const pair< vector<int>::iterator, vector<int>::iterator> p2) const {
        return *(p1.first) >  *(p2.first);      
    }
};

int pq_heapsort_trial() {

    /* Set up the Sorted Vectors */ 
    int a1[] = { 2, 10, 100};
    int a2[] = { 5, 15, 90, 200};
    int a3[] = { 12 }; …
Run Code Online (Sandbox Code Playgroud)

c++ sorting mergesort vector processing-efficiency

9
推荐指数
1
解决办法
8463
查看次数

如何使用向量通过指针引用递归结构

我有结构,让我们称他们为sn,看起来像:

struct sn {
    string name;
    vector<sn*> connected_to;
};
Run Code Online (Sandbox Code Playgroud)

现在,假设我已经从0 - 9声明了connected_to向量; 我将sn A连接到sn B:

A.connected_to[0] = &B; 
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,我会以错误的方式解决这个问题.基本上我正在尝试做的是避免在我连接结构时复制结构...即:

struct sn {
    string name;
    vector<sn> connected_to;
};

// ... 

A.connected_to[0] = B; 
Run Code Online (Sandbox Code Playgroud)

这复制了吗?更基本的问题当然是我不明白向量,指针和引用是如何真正深入工作的.

c++ struct pointers vector

6
推荐指数
1
解决办法
1691
查看次数

更新字典和检查密钥的最快方法

我正在构建一个非常长的字符串(~1G)的字典,其中key是固定长度的k-mer,值是所有出现位置.当k很大(> 9)时,预先构建k-mer字典是没有意义的,因为并非所有值都会发生并且它会使表膨胀.

目前我正在做这样的任务:

def hash_string(st, mersize):

    stsize = len(st)
    hash = {}
    r = stsize-mersize+1

    for i in range(0, r):
        mer = st[i:i+mersize]
        if mer in hash:
            hash[mer].append(i)
        else:
            hash[mer] = [i]

    return hash

# test for function hash_st above        
mer3 = hash_string("ABCDABBBBBAAACCCCABCDDDD", 3) 
Run Code Online (Sandbox Code Playgroud)

最耗时的步骤(我做过cProfile)是查找遇到的键(当我们沿着字符串移动时),是新键还是已经存在.最快的方法是什么?

(我目前正在测试一个避免这一步骤的两遍策略(这对于大型序列来说要快得多),我首先通过简单地覆盖双打来构建密钥列表.然后我不必检查对于密钥存在 - 我用这些密钥种下我的字典,然后在第二遍时,只要在我遇到它们时附加.)

但是我仍然有兴趣知道,总结一下,在Python中查找dict键的最快方法,因为这是一个常见的模式:

如果key存在,则追加新条目,否则,创建密钥并添加第一个元素.

这种模式的最快实现是什么?

python performance dictionary append

2
推荐指数
1
解决办法
2181
查看次数

在Python中以一种很好的方式从列表中访问类变量

假设我有一个列表X = [a,b,c],其中a,b,c是同一个类C的实例.现在,所有这些实例a,b,c都有一个名为v,av,bv,cv的变量...我只想要一个清单Y = [av,bv,cv]

有一个很好的命令来做到这一点?我能想到的最好的方法是:

Y = []
for i in X
    Y.append(i.v)
Run Code Online (Sandbox Code Playgroud)

但它似乎并不优雅〜因为这需要重复任何给定的"v"任何建议?我无法找到一种方法来使用"map"来做到这一点.

python methods class list map

1
推荐指数
2
解决办法
124
查看次数

C++中的Vector:为什么外部维度给出了EXC_BAD_ACCESS而内部维度没有?

我有以下代码为整数向量的向量(即整数矩阵..)

vector<vector<int> > scores (3, vector<int>(2,0));
cout<<scores[1][5];
Run Code Online (Sandbox Code Playgroud)

这不会给出EXC_BAD_ACCESS,但这样做:

cout<<scores[5][1];
Run Code Online (Sandbox Code Playgroud)

为什么行为不同?

只是为了澄清:这并不是特定于给出的示例数字.当内部维度超出界限时,永远不会出现错误,外部则不然!

c++ vector stdvector

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