многопоточность Python . Ускорение кода на потоках

Alex056

Новичок
Пользователь
Апр 5, 2022
2
0
1
# Задача: вычислить 3 тикера с максимальной и 3 тикера с минимальной волатильностью.
# Бумаги с нулевой волатильностью вывести отдельно.
# Результаты вывести на консоль в виде:
# Максимальная волатильность:
# ТИКЕР1 - ХХХ.ХХ %
# ТИКЕР2 - ХХХ.ХХ %
# ТИКЕР3 - ХХХ.ХХ %
# Минимальная волатильность:
# ТИКЕР4 - ХХХ.ХХ %
# ТИКЕР5 - ХХХ.ХХ %
# ТИКЕР6 - ХХХ.ХХ %
# Нулевая волатильность:
# ТИКЕР7, ТИКЕР8, ТИКЕР9, ТИКЕР10, ТИКЕР11, ТИКЕР12
# Волатильности указывать в порядке убывания. Тикеры с нулевой волатильностью упорядочить по имени.

# волатильность = ((максимальная цена - минимальная цена) / средняя цена) * 100
# средняя цена = (максимальная цена + минимальная цена) / 2

# В каждом файле в папке trades содержится данные по сделкам по одному тикеру, разделенные запятыми.
# Первая строка - название колонок:
# SECID - тикер
# TRADETIME - время сделки
# PRICE - цена сделки
# QUANTITY - количество бумаг в этой сделке
# Все последующие строки в файле - данные о сделках


мое решение ниже , но только от этого решения мой код не ускорился , помогите исправить ошибки.
список файлов для перебора в прикрепленном файле ,

Python:
import os
import threading
import time
import itertools


class OPEN(threading.Thread):
    def __init__(self, filename, spisok, slovar,*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.spisok = spisok
        self.slovar = slovar
        self.filename = filename

    def __str__(self):
        return self.filename

    def run(self):

        with open(os.path.join('F:\\my Progects\\lesson_012\\trades', self.filename), 'r', encoding='utf8') as f:
            lines = itertools.islice(f, 1, None)
            for line in lines:
                line = line.split(',')
                self.spisok.append(float(line[2]))
            mini = min(self.spisok)
            maxi = max(self.spisok)
            average_price = (mini + maxi) / 2
            volatility = ((maxi - mini) / average_price) * 100
            self.slovar[self.filename[7:10]] = volatility
            return self.slovar


class SORTER(threading.Thread):

    def run_s(self, slovar, b):
        self.sorted_tuples = sorted(slovar.items(), key=lambda item: item[1])
        a = len(self.sorted_tuples)
        num_max = self.sorted_tuples[a - 3: a]
        num_max.sort(reverse=True)
        num_min = []
        num0 = []

        for item in self.sorted_tuples:
            if int(item[1]) == 0:
                num0.append(item[0])
            if float(item[1]) > 0:
                num_min.append(item)
                b += 1
            if b == 3:
                break
        num0.sort(reverse=False)
        num_min.sort(reverse=True)
        return num_max, num0, num_min


def time_track(func):

    def surrogate(*args, **kwargs):
        started_at = time.time()

        result = func(*args, **kwargs)

        ended_at = time.time()
        elapsed = round(ended_at - started_at, 4)
        print(f'Функция работала {elapsed} секунд(ы)')
        return result

    return surrogate


@time_track
def main():
    slovar1 = {}
    way = os.listdir('F:\\my Progects\\lesson_012\\trades')
    filenames = [OPEN(spisok=[], slovar=slovar1, filename=filename) for filename in way]
    for filename in filenames:
        filename.start()
    for filename in filenames:
        filename.join()

    sorted_slovar1 = SORTER()

    num_max, num0, num_min = sorted_slovar1.run_s(slovar1, 0)

    # переделываю
    print('Максимальная волатильность')
    for item in num_max:
        print(item[0], format(item[1], '.2f'))
    print('Нулевая  волатильность')
    print(*num0)
    print('Минимальная волатильность')
    for item in num_min:
        print(item[0], format(item[1], '.2f'))


if __name__ == '__main__':
    main()
 

Вложения

  • trades.zip
    16,5 КБ · Просмотры: 0

Alex056

Новичок
Пользователь
Апр 5, 2022
2
0
1
Вообщем из за GIL моя многопоточность не работает если не происходит системных вызовов в коде .Я думал , что чтение с файла это и будет тем местом где многопоточность сможет ускорить код , однако нет . Для теста я добавил засыпания на 0,1 сек. , и запустил код . Время работы не увеличилось , следовательно потоки себя проявили.
 

Форум IT Специалистов