之前用 JS 写项目的时候,项目组用的组件模式,一直感觉很不错。最近用 Python 做新项目,项目结构也延续了组件模式。一直没有对函数调用的性能作了解,今天突发奇想测试了一下,写了一些测试代码

首先定义了几个 class :

class A(object):
def test(self):
pass class B(object):
def __init__(self):
self.a = A() def test(self):
pass class C(object):
def __init__(self):
self.b = B() def test(self):
pass class D(object):
def __init__(self):
self.c = C()
def test(self):
pass

对比1:

直接调用实例对象身上的方法 和 使用变量缓存该方法然后调用

n = 10000000
import timeit a = A()
t_direct = timeit.Timer('a.test()', 'from __main__ import a').timeit(n)
print 'direct call func : ', t_direct cache = a.test
t_cache = timeit.Timer('cache()', 'from __main__ import cache').timeit(n)
print 'cache func call : ', t_cache print ' performance : ', (t_cache / t_direct)

尝试多次后得出该情况下的时间结论:

direct call func :  1.14136314392
cache func call : 0.745277881622
performance : 0.652971743123

缓存方法之后再调用,性能大约能提升 35%

调用函数时,python 会临时创建一个对象,比如直接调用函数 a.test() 时,python 会执行如下步骤:

1: temp = a.test

2: temp()

3: del temp

所以频繁调用时,性能上是一个问题。内存上应该也是一个问题,感觉会更加频繁的触发 gc

对比2:

通过成员变量多层调用一个函数,和直接调用对象身上的函数的性能差

t0 = timeit.Timer('d.test()', 'from __main__ import d').timeit(n)
print '0 level: ', t0 t1 = timeit.Timer('d.c.test()', 'from __main__ import d').timeit(n)
print '1 level: ', t1, ' : ', (t1 / t0) * 100 t2 = timeit.Timer('d.c.b.test()', 'from __main__ import d').timeit(n)
print '2 level: ', t2, ' : ', (t2 / t1) * 100, ' ', (t2 / t0 * 100) t3 = timeit.Timer('d.c.b.a.test()', 'from __main__ import d').timeit(n)
print '3 level: ', t3, ' : ', (t3 / t2) * 100, ' ', (t3 / t0 * 100)

尝试多次后得出该情况下的时间结论:

0 level:   1.26769399643

1 level:   1.50338602066     :  118.592185882

2 level:   1.74297595024     :  115.936687337      137.491851752

3 level:   1.87865877151     :  107.784549251      148.194972667

基本上,函数调用层次多一层,性能消耗会多 5% 到 15% 左右

这个暂时无法详细的解答。手上也没有 JS 的测试数据,不确定当时 js 些写项目的时候,是否也存在这个性能问题。

之前碰到一些项目的结构是,写的时候分成了多个文件来写,但是最后运行的时候,会把这多个文件中定义的 属性、函数都聚合到一个 class 身上,成为一个巨无霸级的 class。一直不理解这么做的意义是什么,感觉很臃肿,现在看来 估计为了减少函数调用的层次,提高性能。

Python 函数调用性能记录的更多相关文章

  1. [转] Python 代码性能优化技巧

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...

  2. Python代码性能优化技巧

    摘要:代码优化能够让程序运行更快,可以提高程序的执行效率等,对于一名软件开发人员来说,如何优化代码,从哪里入手进行优化?这些都是他们十分关心的问题.本文着重讲了如何优化Python代码,看完一定会让你 ...

  3. 测试c语言函数调用性能因素之测试三

    函数调用:即调用函数调用被调用函数,调用函数压栈,被调用函数执行,调用函数出栈,调用函数继续执行的一个看似简单的过程,系统底层却做了大量操作. 操作: 1,               调用函数帧指针 ...

  4. Python 代码性能优化技巧(转)

    原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...

  5. Python 代码性能优化技巧

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...

  6. 7个提升Python程序性能的好习惯

    原文作者:爱coding,会编程的核电工程师. 个人博客地址:zhihu.com/people/zhong-yun-75-63 掌握一些技巧,可尽量提高Python程序性能,也可以避免不必要的资源浪费 ...

  7. 关于Python Profilers性能分析器

    1. 介绍性能分析器 作者:btchenguang profiler是一个程序,用来描述运行时的程序性能,并且从不同方面提供统计数据加以表述.Python中含有3个模块提供这样的功能,分别是cProf ...

  8. 七个可以提升python程序性能的好习惯,你知道吗?

    掌握一些技巧,可尽量提高Python程序性能,也可以避免不必要的资源浪费.今天就为大家带来七个可以提升python程序性能的好习惯,赶快来学习吧:. 1.使用局部变量 尽量使用局部变量代替全局变量:便 ...

  9. python——关于Python Profilers性能分析器

    1. 介绍性能分析器 profiler是一个程序,用来描述运行时的程序性能,并且从不同方面提供统计数据加以表述.Python中含有3个模块提供这样的功能,分别是cProfile, profile和ps ...

随机推荐

  1. MongoDB 管理

    1.给数据库增加分片功能 mongos> use admin mongos> db.runCommand({enablesharding:"cipnet"}) mong ...

  2. 8、hzk16的介绍以及简单的使用方法

    HZK16 字库是符合GB2312标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个.其中一级汉字有3755个,按 声序排列,二级汉字有3008个,按偏旁部首 ...

  3. Ubuntu UEFI 模式下安装基本原则

    https://help.ubuntu.com/community/UEFI Introduction The Extensible Firmware Interface (EFI) or its v ...

  4. 如何在 BitNami 中创建多个 WEB 应用?(转)

    本文最后更新于2015年7月14日,已超过半年没有更新,如果内容失效,请反馈,谢谢! 如您所知,BitNami 为诸多开源 WEB 应用提供集成环境的一键安装解决方案,像著名的开源 WEB 程序 Wo ...

  5. Objective-C中 ==、isEqual、isEqualToString判断字符串相等

    图片发自简书App 在判断一个字符串类型的变量是否与某字符时相等,你可能写下这样一行代码 if (activityType == @"0"){} //activityType是某一 ...

  6. Android 闹钟最终版

    以下是我发现的几点闹钟中重要的点,分享一下: (1)在闹钟中有AudioManager管理机制,这个机制可以申请和释放OnAudioFocusChangeListener监听. 还有mTelephon ...

  7. 【24.34%】【codeforces 560D】Equivalent Strings

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  8. RSA算法原理(转)

    如果你问我,哪一种算法最重要?我可能会回答“公钥加密算法”.因为它是计算机通信安全的基石,保证了加密数据不会被破解.你可以想象一下,信用卡交易被破解的后果. 进入正题之前,我先简单介绍一下,什么是”公 ...

  9. 安装alien,DEB与RPM互换

    http://blog.csdn.net/sidely/article/details/40181653

  10. "Swift"编程语言

    来自英文文档.百度翻译以及自己没过4级的渣渣英语功底,为了自己以后看起来方便 About Swift 关于"海燕" IMPORTANT 重要 This is a prelimina ...