1

对不起我的英语不好。我目前正在使用 python,我有一个问题是填充 10000x10000 的矩阵大小太慢了。我编写了一个“松弛方法”,我需要测试不同大小的矩阵。你怎么看关于那个?...PS 我等待 3-5 分钟来填充一个 10000x10000 的矩阵。

    def CalcMatrix(self):
    for i in range(0, self._n + 1):                       #(0,10000)
        for j in range(0, self._n + 1):                   #(0,10000)
                one = sin(pi * self._x[i])                # x is the vector of size 10000
                two = sin(pi * self._y[j])                # y too
                self._f[i][j] = 2 * pi * pi * one * two   #fill 
4

2 回答 2

1

本机 Python 循环速度非常慢。在 Python 中使用数组和矩阵的人通常使用numpy. 还有其他工具,如 cython 和 numba,它们可以在某些情况下显着提高速度,但其基本思想numpy是将操作矢量化并将艰苦的工作推向用 C 和 fortran 实现的快速库。

下面的代码在我不太快的笔记本上只需要几秒钟:

import numpy as np
from numpy import pi
x = np.linspace(0,1,10**4)
y = np.linspace(2,5,10**4)
ans = 2*pi**2 * np.outer(np.sin(pi*x), np.sin(pi*y))

(PS:如果你的_n == 10000,那么你的矩阵不是10001x10001,而不是10000x10000吗?)

于 2013-11-09T13:22:31.553 回答
0

一些改进是可能的。考虑将一些计算移出循环

def CalcMatrix(self):
for i in range(0, self._n + 1):                       #(0,10000)
    one = sin(pi * self._x[i])                # x is the vector of size 10000
    for j in range(0, self._n + 1):                   #(0,10000)
            two = sin(pi * self._y[j])                # y too
            self._f[i][j] = 2 * pi * pi * one * two   #fill 

该值2 * pi * pi 可以预先计算并存储在变量中,因此不必每次在循环中重新计算。

如果这还不够,请考虑使用 C 或 Fortran 等本地语言。

于 2013-11-09T13:06:58.573 回答