以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  高级功能研发区  (http://weistock.com/bbs/list.asp?boardid=5)
----  发现通过VBA调用PY模块速度很慢  (http://weistock.com/bbs/dispbbs.asp?boardid=5&id=175591)

--  作者:分析者
--  发布时间:2020/4/18 16:39:07
--  发现通过VBA调用PY模块速度很慢
发现通过VBA调用PY模块速度很慢,就模仿教程中的例子,通过VBA调用了一个PY模块中的函数,函数中什么都没有做,每翻一支个股K线图就调用一次翻,用PGUP、PGDN键翻看个股,发现翻看速度很慢,只要取消这个调用,就正常了。
这个速度太慢,不适合用来计算指标快速查看个股。
这个问题可否优化?


--  作者:马良
--  发布时间:2020/4/18 21:25:01
--  
测试代码发我们看一下
--  作者:分析者
--  发布时间:2020/4/18 21:46:07
--  
def zhibiao_vba():
    code_n=\'SH600126\'   
    if code_n !=None:
        return "已将指标写入数据库1"        
    else:
        return "计算失败"

以上是PY模块代码,VBA代码就和你们的示例一样的
[此贴子已经被作者于2020/4/18 21:46:31编辑过]

--  作者:马良
--  发布时间:2020/4/19 17:23:36
--  
请提供完整的vba代码,便于我们重现你说的问题
--  作者:分析者
--  发布时间:2020/4/20 17:37:25
--  

private    StockLabel ,lastStockLabel
\'\'\'\'\'\'\'\'\'\'\'\'如下为绘图主函数
Sub Technic_Paint()
    dim grid
    Set grid = Technic.GetGridByName("Main")
    dim count
    dim StockLabel
    count =grid.GetHistoryData().count
    StockLabel=grid.StockLabel  
    if not( grid is nothing ) and  lastStockLabel<>StockLabel and grid.IsWindow   then
     \'当K线数量变化、证券品种变化、周期变化、新行情到来,重新计算行情数据
        grid.CoordinateMode=1 \'设置为对数坐标
        grid.MustPower=1      \'复权
        grid.PowerAspect=0    \'向前复权
        tn=0 \'当需要重新计算行情数据,将TN初始化为0
        call Test 
    end if 
    lastStockLabel=grid.StockLabel
end sub
\'调用VBA函数
sub Test
       \'创建外部对象,启用Python引擎
       Set d = CreateObject("Stock.Python")
       \'载入Python模块,模块名为MyPython
       ret = d.ImportModule("jzt_MyPython1")
       If ret <> 1 Then
              \'载入失败,打印错误原因
              Msg = d.GetErrorInfo()
              Application.MsgOut Msg
              Set Msg = Nothing\'使用完毕需要 Set Nothing销毁以免出现内存泄漏
              Exit Sub
     End If
       Data = d.CallObject("zhibiao_vba")\'调用PY模块中的函数
       If IsEmpty(Data) Then
              Msg = d.GetErrorInfo()
              Application.MsgOut Msg
              Set Msg = Nothing\'使用完毕需要 Set Nothing销毁以免出现内存泄漏
              Exit Sub
       End If
       \'打印返回值
       application.MsgOut "Result:"&Data
       Set d = nothing\'使用完毕需要 Set Nothing销毁以免出现内存泄漏
end Sub
[此贴子已经被作者于2020/4/20 17:37:47编辑过]

--  作者:无为剑
--  发布时间:2020/4/20 17:52:13
--  
Set d = CreateObject("Stock.Python")
你应该将这个对象创建放在外面做成一个全局的,不要放在Test函数里,因为反复创建这个是最消耗资源的

--  作者:分析者
--  发布时间:2020/4/22 17:33:59
--  
果然如此,修改后就解决了,太感谢了!!!
我调试了1天都没有找到问题,老师一句话就解决了。

--  作者:分析者
--  发布时间:2020/4/22 17:34:48
--  
不过,建议将这点写到教程中,免得其他人也在此浪费时间,谢谢