Как определить, работает ли программа на Python, не дожидаясь ее завершения? - PullRequest
0 голосов
/ 02 ноября 2018

Вот мой код:

import xlwings as xw
import datetime as dt
import numpy as np
import pandas as pd
import threading
import time

#connect to workbook
wb = xw.Book(r'C:\Users\Ryan\AppData\Local\Programs\Python\Python37-32\constituents.xlsx')
sht = wb.sheets['constituents']

#store data in np array, pass to Pandas
a = sht.range('A2:C1760').options(np.array).value
df = pd.DataFrame(a)
df = df.rename(index=str, columns={0: "tickers", 1: "start_dates", 2: "end_dates"})

#initialize variables
start_quarter = 0
start_year = 0
fiscal_dates = []
s1 = pd.date_range(start='1/1/1964', end='12/31/2018', freq='B')
df2 = pd.DataFrame(data=np.ndarray(shape=(len(s1),500), dtype=str), index=s1)

#create list of fiscal quarters
def fiscal_quarters(start_year):
    year_count = start_year - 1
    quarter_count = 1
    for n in range(2019 - start_year):
        year_count += 1
        for i in range(1,5):
            fiscal_dates.append(str(quarter_count) + 'Q'+ str(year_count)[-2:])
            quarter_count += 1
        quarter_count = 1 

#iterate over list of tickers to create self-named spreadsheets
def populate_worksheets():
    for n in range(len(fiscal_dates)):
        wb.sheets.add(name=fiscal_dates[n])

#populate df2 with appropriate tickers
def populate_tickers():
    count = 0
    for n in range(len(s1)):
        for i in range(len(df['tickers'])):
            if df.loc[str(i), 'start_dates'] <= s1[n] and df.loc[str(i), 'end_dates'] > s1[n]:
                count += 1
                df2.loc[str(s1[n]), str(count)] = df.loc[str(i), 'tickers']
        count = 0

#run populate_tickers function with status updates
def pt_thread():
    t = threading.Thread(target=populate_tickers)
    c = 0
    t.start()
    while (t.is_alive()):
        time.sleep(5)
        count += 5
        print("Working... " + str(c) + 's')

Сначала я запускаю fiscal_quarters(1964) в Python Shell, затем pt_thread(), что выглядит особенно ресурсоемким. На данный момент он работает более полчаса на моем (по общему признанию, медленном) ноутбуке. Однако, не дожидаясь его завершения, есть ли способ увидеть, работает ли он так, как задумано? Или вообще? Он по-прежнему печатает «Работает ...» в оболочке, что, я полагаю, является хорошим знаком, но я бы хотел начать устранение неполадок, если что-то не так, вместо того, чтобы ждать неопределенное количество времени, прежде чем отказаться от него.

Для справки, серия s1 содержит ~ 17 500 элементов, а столбец df ['tickers'] содержит ~ 2000 элементов, поэтому должно быть где-то около 35 000 000 итераций с 4 операциями в каждой. Это много, или современный ПК должен справиться с этим довольно быстро, и моя программа, вероятно, просто не работает?

1 Ответ

0 голосов
/ 02 ноября 2018

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

from tqdm import tqdm

def sim(sims):
    x = 0
    pb = tqdm(total=sims, initial=x)
    while x < sims:
        x+=1
        pb.update(1)
    pb.close()
sim(5000000)
...