在测量代码的运行时间时,我将如何使用执行代码来求解矩阵?

How would I use execute code to solve matrices while measuring the runtime of the code?

我最好使用 C++ 来执行代码,但我愿意接受任何针对这种情况的更好语言的建议。我基本上想使用 Strassen 算法来求解矩阵,并且我想知道如何求解矩阵并测量其 运行 时间。 # 版本 3.6

import numpy as np 

def split(matrix): 
""" 
    Splits a given matrix into quarters. 
    Input: nxn matrix 
    Output: tuple containing 4 n/2 x n/2 matrices corresponding to a, b, c, d 
"""
row, col = matrix.shape 
row2, col2 = row//2, col//2
return matrix[:row2, :col2], matrix[:row2, col2:], matrix[row2:, :col2], 
matrix[row2:, col2:] 

def strassen(x, y): 
""" 
Computes matrix product by divide and conquer approach, recursively. 
Input: nxn matrices x and y 
Output: nxn matrix, product of x and y 
"""

# Base case when size of matrices is 1x1 
if len(x) == 1: 
    return x * y 

# Splitting the matrices into quadrants. This will be done recursively 
# untill the base case is reached. 
a, b, c, d = split(x) 
e, f, g, h = split(y) 

# Computing the 7 products, recursively (p1, p2...p7) 
p1 = strassen(a, f - h) 
p2 = strassen(a + b, h)      
p3 = strassen(c + d, e)        
p4 = strassen(d, g - e)      
p5 = strassen(a + d, e + h)      
p6 = strassen(b - d, g + h) 
p7 = strassen(a - c, e + f) 

# Computing the values of the 4 quadrants of the final matrix c 
c11 = p5 + p4 - p2 + p6 
c12 = p1 + p2        
c21 = p3 + p4            
c22 = p1 + p5 - p3 - p7 

# Combining the 4 quadrants into a single matrix by stacking horizontally and vertically. 
c = np.vstack((np.hstack((c11, c12)), np.hstack((c21, c22)))) 

return c 

我找到了上面的算法代码。

#include <time.h>
int main(void) {
clock_t tStart = clock();
/* Do your stuff here */
printf("Time taken: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
return 0;

}

我找到了这个用于测量代码运行时间的代码。但是我看到我可以使用

/usr/bin/time ./MyProgram if I have cygwin installed.

简而言之,我将如何使用我的代码使用 Strassen 算法和其他矩阵求解算法来求解实际矩阵?另外,我将如何 运行 代码?谢谢大家的帮助,我是coding的新手,为了测试不同矩阵求解算法在不同场景下的算法效率,所以才这样做。

  1. 时间测量

    时间的测量取决于平台那又怎样OS?在 windows 上,我会使用 Performance Counters。如果您可以访问 x86 程序集,您也可以使用 RDTSC 指令,但这需要一些知识才能正确使用,例如将亲和力设置为单个 CPU、获取和稳定 CPU 频率等

    OS time granularity 也是一个问题,因此如果您的测量过程太短,您可能需要对多个测量进行一些过滤以获得正确的值。

    您可以通过测量该过程的多次重复来避免某些问题,这样时间就会超过 100 毫秒,并将结果时间除以重复次数。

    同时重复使用相同的 code/data,同时测量 CACHE can be a problem 太乱了你的结果。

  2. 运行宁码

    你的代码看起来像 Python 所以你不能直接在 C/C++ 中使用它,而是需要用 Python 解释器以某种方式调用它,例如 creating python process 参数告诉它打开和 运行 你的源代码。但是,在这种情况下,如果它仍然有效,您需要等待代码完成扫描它的句柄...当然,您需要以完成后关闭的方式编写和执行 python 内容。但是我担心这会增加很大的开销,因为 starting/stopping 单独的 python 过程可能比您测量的矩阵乘法慢得多...

    其他选择是以 DLL 或 OBJ 形式将其导入到您的 C/C++ 中(但不确定 Python 代码是否可行)。这样你只需要在你的 C/C++ 应用程序中调用一个函数就没有问题了...

    有关灵感,请参阅:

    • Builder C++ calling VC++ class

    如果代码不太复杂或不需要其他库和东西,您可以尝试将其移植到 C/C++ 代码并直接使用它。