Ускорьте вычисления алгебры c - PullRequest
0 голосов
/ 03 апреля 2020

У меня 1000 текстовых файлов, включая 6 столбцов, и мне нужно вычислить простую алгебраическую операцию c, используя столбцы come в каждом файле, а затем построить простой график результата, но это заняло более 6 часов вычислений. Это немного странно только для этой мелочи, занимающей так много времени. Вот код:

modes = [f for f in sorted(os.listdir('.')) if f.startswith('config')]

maxnum = np.max([int(os.path.splitext(f)[0].split('_')[1]) for f in RIVERS])
modes = ['configuration_%d.out' % i for i in range(maxnum)]

for i, d in enumerate(modes):

    a = np.loadtxt(d).T 
    x = a[0]
    y = a[1]
    for l in range(len(x)):
        l_c = np.sqrt((y[-1]-y[0])**2 + (x[-1]-x[0])**2)

    j = a[2]
    for k in range(len(j)):
        l_i = j[-1]-j[0]
        sigma = l_i/l_c
        plt.plot(sigma)
    #tt = np.arange(0,1000)
    #plt.plot(tt,sigma)

plt.show()

Вся помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Вы можете использовать многопоточность или многопроцессорность, чтобы ускорить это. Самый простой способ - использовать модуль Threading .

Python Документация: Threading

Простой пример:

import threading

#Define how many threads you want
numberOfThreads = 5

#Create threads
threads = [threading.Thread(target=myFunction, args=(myArguments,)) for _ in range(0, numberOfThreads)]

    #Start all threads
    for thread in threads:
        thread.start()
    #Script waits until last thread has finished
    for thread in threads:
        thread.join()

def myFunction(myArguments):
    #Do calculation

Если у вас есть 1k текстовых файлов для обработки, я рекомендую модуль Queue . Очередь содержит путь ко всем файлам, и ваши потоки выбирают один за другим для обработки.

Python Документация: Очередь

Простой пример:

from queue import Queue

#Create Queue object
q = Queue()

#Put item to queue
q.put("/myPath/filename.txt")

#Get and process each item in queue and remove it (so it gets processed only once)
while not q.empty():
    myPath = q.get()

Потоки все еще работают на одном ядре процессора. Если скорость все еще не удовлетворена, вам следует использовать многопроцессорность вместо многопоточности.

Я рекомендую модуль concurrent.futures . Это работает почти так же, как примеры потоков.

Python Документация: concurrent.futures

0 голосов
/ 08 мая 2020

Для решения математических и любых алгебраических операций c, в первую очередь, с учетом подготовки пустого пространства для сохранения значений переменных. Эта вещь вносит значительный вклад в повышение эффективности кода, например, используя my_list=[], а затем my_list.append(var). Другой способ - использовать подготовленные библиотеки, а не писать с нуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...