欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → 发现通过VBA调用PY模块速度很慢

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有2767人关注过本帖树形打印复制链接

主题:发现通过VBA调用PY模块速度很慢

帅哥哟,离线,有人找我吗?
分析者
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:319 积分:0 威望:0 精华:1 注册:2015/11/1 14:20:16
发现通过VBA调用PY模块速度很慢  发帖心情 Post By:2020/4/18 16:39:07 [只看该作者]

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


 回到顶部
帅哥哟,离线,有人找我吗?
马良
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:1516 积分:229 威望:0 精华:0 注册:2012/3/30 12:40:56
  发帖心情 Post By:2020/4/18 21:25:01 [只看该作者]

测试代码发我们看一下

 回到顶部
帅哥哟,离线,有人找我吗?
分析者
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:319 积分:0 威望:0 精华:1 注册:2015/11/1 14:20:16
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
马良
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:1516 积分:229 威望:0 精华:0 注册:2012/3/30 12:40:56
  发帖心情 Post By:2020/4/19 17:23:36 [只看该作者]

请提供完整的vba代码,便于我们重现你说的问题

 回到顶部
帅哥哟,离线,有人找我吗?
分析者
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:319 积分:0 威望:0 精华:1 注册:2015/11/1 14:20:16
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
无为剑
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:2437 积分:0 威望:0 精华:0 注册:2016/3/5 22:53:41
  发帖心情 Post By:2020/4/20 17:52:13 [只看该作者]

Set d = CreateObject("Stock.Python")
你应该将这个对象创建放在外面做成一个全局的,不要放在Test函数里,因为反复创建这个是最消耗资源的

 回到顶部
帅哥哟,离线,有人找我吗?
分析者
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:319 积分:0 威望:0 精华:1 注册:2015/11/1 14:20:16
  发帖心情 Post By:2020/4/22 17:33:59 [只看该作者]

果然如此,修改后就解决了,太感谢了!!!
我调试了1天都没有找到问题,老师一句话就解决了。

 回到顶部
帅哥哟,离线,有人找我吗?
分析者
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游侠 帖子:319 积分:0 威望:0 精华:1 注册:2015/11/1 14:20:16
  发帖心情 Post By:2020/4/22 17:34:48 [只看该作者]

不过,建议将这点写到教程中,免得其他人也在此浪费时间,谢谢

 回到顶部