小编BZ1*_*BZ1的帖子

为什么deque在C++中使用比vector更多的RAM?

我有一个问题,我正在努力,我需要使用某种二维数组.数组是固定宽度(四列),但我需要动态创建额外的行.

为此,我一直在使用向量的向量,我一直在使用一些包含这个的嵌套循环:

array.push_back(vector<float>(4));
array[n][0] = a;
array[n][1] = b;
array[n][2] = c;
array[n][3] = d;
n++
Run Code Online (Sandbox Code Playgroud)

添加行及其内容.问题是我似乎因为我试图创建的元素数量而耗尽内存,所以我减少了我使用的数量.但后来我开始阅读deque,并认为它可以让我使用更多的内存,因为它不必是连续的.在这个循环中,我将所有提到的"vector"改为"deque",以及所有声明.但后来看来我再次耗尽内存,这次即使行数减少也是如此.

我查看了我的代码使用了多少内存,当我使用deque时,内存稳定上升到2GB以上,程序很快关闭,即使使用较少的行数.当内存耗尽时,我不确定它在这个循环中的确切位置.

当我使用向量时,即使循环退出,内存使用(对于相同的行数)仍然低于1GB.然后继续进行类似的循环,添加更多行,仍然只达到约1.4GB.

所以我的问题是.对于deque来说,使用两倍以上的向量内存是正常的,还是我在思考我可以在声明/初始化和上面的代码中用"deque"替换单词"vector"时做出错误的假设?

提前致谢.

我正在使用:MS Visual C++ 2010(32位)Windows 7(64位)

c++ ram vector deque visual-c++

8
推荐指数
3
解决办法
1748
查看次数

如何更改foreach迭代器引用的原始数据类型变量的值

如果我有一个Ball具有set其属性访问器的类radius,我可以Ball使用foreach循环设置对象列表的半径:

foreach(Ball ball in balls)
{
    ball.radius = 1;
}
Run Code Online (Sandbox Code Playgroud)

但是如果我迭代一组原始数据类型,这不起作用,因为原语没有访问器.如果我尝试更改原始数据类型的值,我实际上是在迭代器上执行操作,而不是为自身值,所以以下方法不起作用:

foreach(double radius in radii)
{
    radius = 1;
}
Run Code Online (Sandbox Code Playgroud)

我尝试用指针解决它,像这样:

double* p;
foreach(double radius in radii)
{
    p = &radius;
    *p = 1;
}
Run Code Online (Sandbox Code Playgroud)

不出所料,这不起作用,因为它p引用了迭代器占用的地址,而不是变量.


如果它在这里很重要,我将更具体地说明我实际上要做的事情,虽然我仍然想要回答我的主要问题,但很可能有一种更简单的方法来做这个方法对List<>,我不太熟悉.我有一个List<List<double>>,我想改变每个元素,特别是通过将每个元素除以一个归一化常数normalisationFactor.以下工作完美:

for (int i = 0; i < array.Count; i++)
{
    for (int j = 0; j < array[0].Count; j++)
    {
        array[i][j] /= normalisationFactor;
    }
} …
Run Code Online (Sandbox Code Playgroud)

c# foreach primitive iterator

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

在大型阵列上进行手动元素操作的numpy更快的替代方案?

我有一些代码最初使用C风格的malloc数组用C语言(由其他人编写).我后来将其中很多内容转换为C++样式,使用vector<vector<vector<complex>>>数组与我项目的其余部分保持一致.我从来没有计时,但两种方法似乎速度相似.

我最近在python中开始了一个新项目,我想使用一些旧的代码.我不想将数据移回到项目之间,我决定将这些旧代码移植到python中,以便将它们全部放在一个项目中.我天真地用python语法输入所有代码,用numpy数组替换旧代码中的任何数组(像这样初始化它们array = np.zeros(list((1024, 1024)), dtype=complex)).代码工作正常,但速度极慢.如果我不得不猜测,我会说它的速度慢了1000倍.

现在看了一下,我看到很多人说numpy对于元素操作非常缓慢.虽然我已经将一些numpy函数用于常见的数学运算,例如FFT和矩阵乘法,但我的大部分代码都涉及嵌套for循环.很多都很复杂,在我看来似乎不适合简​​化为numpy更快的简单数组操作.

所以,我想知道是否有一种替代numpy,这种计算更快.理想情况是我可以导入一个具有许多相同功能的模块,因此我不必重写我的大部分代码(即,可以执行FFT并以相同方式初始化数组的东西)但是,如果没有这个,我会很满意我至少可以用于代码中计算要求更高的部分,并根据需要在numpy数组之间来回转换.

cpython数组听起来很有希望,但我见过的很多基准测试并没有为我的目的显示出足够的速度差异.为了解我正在谈论的事情,这是减慢我的代码的方法之一.这称为数百万次,该vz_at()方法包含一个查找表,并进行一些插值以给出最终的返回值:

    def tra(self, tr, x, y, z_number, i, scalex, idx, rmax2, rminsq):
        M = 1024
        ixo = int(x[i] / scalex)
        iyo = int(y[i] / scalex)
        nx1 = ixo - idx
        nx2 = ixo + idx
        ny1 = iyo - idx
        ny2 = iyo + idx

        for ix in range(nx1, nx2 + 1):
            rx2 = x[i] - float(ix) * scalex
            rx2 = rx2 * rx2
            ixw = …
Run Code Online (Sandbox Code Playgroud)

python arrays optimization performance numpy

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