【发布时间】:2018-11-06 08:08:35
【问题描述】:
我有一个似乎运行缓慢的脚本,我使用 cProfile(和可视化工具 KCacheGrind)对其进行了分析
似乎占用了几乎 90% 的运行时间的是导入序列,尤其是 _ _ init _ _.py 文件的运行...
这里是 KCacheGrind 输出的截图(抱歉附上图片...)
我不太熟悉 python 中的导入序列是如何工作的,所以也许我有些困惑......我还在我的每个定制包中放置了_ _ init _ _.py 文件,不确定这是否是我应该拥有的完成。
无论如何,如果有人有任何提示,不胜感激!
编辑:功能按自身排序时的附加图片:
EDIT2:
这里附上代码,以便回答者更清楚:
from strategy.strategies.gradient_stop_and_target import make_one_trade
from datetime import timedelta, datetime
import pandas as pd
from data.db import get_df, mongo_read_only, save_one, mongo_read_write, save_many
from data.get import get_symbols
from strategy.trades import make_trade, make_mae, get_prices, get_signals, \
get_prices_subset
#from profilehooks import profile
mongo = mongo_read_only()
dollar_stop = 200
dollar_target = 400
period_change = 3
signal = get_df(mongo.signals.signals, strategy = {'$regex' : '^indicators_group'}).iloc[0]
symbol = get_symbols(mongo, description = signal['symbol'])[0]
prices = get_prices(
signal['datetime'],
signal['datetime'].replace(hour = 23, minute = 59),
symbol,
mongo)
make_one_trade(
signal,
prices,
symbol,
dollar_stop,
dollar_target,
period_change)
函数 get_prices 只是从 mongo db 数据库中获取数据,而 make_one_trade 使用 pandas 进行简单的计算。这在我的项目中的其他任何地方都不会出现问题。
EDIT3:
当我在“视图”选项卡中选择“检测周期”选项时,这里是 Kcache 研磨屏幕:
这是否真的意味着我自己创建的包中确实存在循环导入,需要花费所有时间才能解决?
【问题讨论】:
-
没有。您将 聚合时间 与方法本身所花费的时间混为一谈。
__init__调用其他方法,这些方法一起需要很多时间。 -
我不太清楚你在这里问什么?
-
@MartijnPieters 通常点击图中的函数会显示子函数,但这里似乎是某种循环,并且所有函数都标记为
,所以它没有告诉我什么需要时间... -
@jimbasquiat:那是因为
<frozen importlib.*>路径都以关键路径部分的本机 C 实现结束,cProfile 不会获取这些路径。你真的想过滤掉那些。 -
@StephenRauch 我不明白如何在此处继续进行分析,因为箭头会循环,而且似乎导入需要时间。如果有人对这种情况有过一些经验,我会很高兴知道如何继续了解什么是需要时间的,如何发现它。