如何判断Python程序是否工作而不必等待它完成?

2024-03-29 14:50:28 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的密码:

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')

首先,我在pythonshell中运行fiscal_quarters(1964),然后运行pt_thread(),这看起来特别需要大量资源。它已经在我的笔记本电脑上运行了半个多小时了。然而,在不等待它完成运行的情况下,是否有任何方法可以查看它是否按预期工作?或者根本没有?它仍在向shell打印“正在工作…”,我认为这是一个好迹象,但如果出现问题,我想开始排除故障,而不是无限期地等待一段时间后再放弃。你知道吗

作为参考,s1系列包含约17500个项目,而df['tickers']列包含约2000个项目,因此应该有大约35000000个迭代,每个迭代有4个操作。这是一个很大的问题,还是一个现代的个人电脑应该能够很快地解决这个问题,而我的程序可能只是不工作?你知道吗


Tags: inimportdfforcountrangeyearstart
1条回答
网友
1楼 · 发布于 2024-03-29 14:50:28

如果您运行的循环花费了很长时间,并且希望了解发生了什么,那么可以使用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)

相关问题 更多 >