Как бы я использовал исполняемый код для решения матриц при измерении времени выполнения кода?

Я бы предпочел использовать C++ для выполнения кода, но я открыт для любых предложений по лучшему языку для данной ситуации. По сути, я хочу использовать алгоритм Штрассена для решения матриц, и я хочу знать, как я буду решать матрицы и измерять время их выполнения. # Версия 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.

Короче говоря, как бы я использовал свой код для решения реальных матриц с использованием алгоритма Штрассена и других алгоритмов решения матриц? И как мне запустить код? Спасибо за помощь, я новичок в кодировании, и я делаю это, чтобы проверить алгоритмическую эффективность различных алгоритмов решения матриц в разных сценариях.


person tranquil10295    schedule 11.02.2021    source источник
comment
Если на вашем компьютере установлена ​​ОС Linux, см. time(7).   -  person Basile Starynkevitch    schedule 11.02.2021


Ответы (1)


  1. Измерение времени

    измерение времени зависит от платформы, так какая ОС? В Windows я бы использовал счетчики производительности. Если у вас есть доступ к сборке x86, вы также можете использовать инструкцию RDTSC, но для ее правильного использования требуются некоторые знания, такие как установка привязки к одному ЦП, получение и стабилизация частоты ЦП и т. д.

    зернистость времени ОС также является проблемой, поэтому, если ваш измеряемый процесс слишком короткий, вам может потребоваться некоторая фильтрация нескольких измерений в чтобы получить правильные значения.

    Вы можете избежать некоторых проблем, измерив несколько повторений процесса, чтобы время превышало 100 мс, и разделив полученное время на количество повторений.

    Кроме того, при повторном использовании одного и того же кода/данных при измерении CACHE может возникнуть проблема, которая может испортить ваши результаты.

  2. запуск кода

    Ваш код выглядит как Python, поэтому вы не можете использовать его в C/C++ напрямую, вместо этого вам нужно как-то вызывать его с помощью интерпретатора Python, например, с помощью создание процесса python с параметрами, указывающими ему открыть и запустить исходный код. Однако в этом случае вам нужно дождаться завершения кода, просканировав его дескриптор, если он все еще действителен... Грубо говоря, вам нужно написать и выполнить свой материал python таким образом, чтобы после завершения он закрывался. Однако я боюсь, что это добавит больших накладных расходов, так как запуск/остановка процесса python может быть намного медленнее, чем умножение матрицы, которое вы измеряете...

    Другой вариант - иметь его в форме DLL или OBJ и вместо этого импортировать его в ваш C/C++ (однако не уверен, что это возможно для кода Python). Таким образом, вам просто нужно вызвать функцию в вашем приложении C/C++, чтобы не было проблем...

    Для вдохновения см.:

    Если код не слишком сложен или не требует других библиотек и прочего, вы можете попробовать перенести его в код C/C++ и использовать напрямую.

person Spektre    schedule 11.02.2021
comment
Спасибо за ваш ответ. Я не уверен, является ли код Python или C++, но мне определенно понадобится ваш совет по запуску кода. Как бы я решил математическое матричное уравнение, используя код, например, чтобы получить решение? - person tranquil10295; 11.02.2021
comment
@ tranquil10295 зависит от того, что вы подразумеваете под решением ... Алгоритм Штрассена - это просто быстрый алгоритм для умножения n матриц ... так что вам нужно решить уравнение или вы просто хотите измерить / оценить алгоритм умножения? ... в любом случае, если вы работаете на C/C++, лучше всего будет перенести измеренный код на C/C++ или использовать его собственный язык кода и измерить его, полностью забыв о C/C++. PS код определенно не C++ и напоминает синтаксис Python и/или Matlab. - person Spektre; 11.02.2021
comment
Извините, я не понял, что код на самом деле был Python. Я думаю, что вместо этого я запущу код на python. Я думал об использовании алгоритма для решения реального уравнения при измерении времени выполнения программы, поэтому я думаю, что это в основном бенчмаркинг алгоритма. Язык кодирования на самом деле не имеет значения, хотя Python, вероятно, будет более простым в использовании в этом сценарии. Спасибо вам за помощь - person tranquil10295; 12.02.2021