我在研究中广泛使用Python编程语言,并且有一些出版物需要提交我的代码库。我目前主要进行最近邻类型的数据挖掘。我开始担心编写最好的代码,因为其他人开始使用我的代码。目前,我正在迭代大量目录(~100,000)并使用单个main()函数顺序调用一系列小函数,每个函数执行一个单独的任务:
import os
# ... other libs
def my_function_A():
print('my function A')
def my_function_B():
print('my function B')
def my_function_C():
print('my function C')
# ... 40 or more such functions
def main():
my_function_A() # do task a
my_function_B() # do task b
my_function_C() # do task c
# ....
return result
for dirs in os.listdir(dir_to_iterate_over):
result = main()
# iterate over many directories
我的高级主管希望所有功能最多只执行一项任务,但在这里我称之为执行大量任务的主要功能。关于这种方法如何影响整体程序性能(即它对动态堆栈分配有什么影响等)我感兴趣(并且有点担心)。
答案 0 :(得分:1)
问题的高级部分:
调用函数执行任务是我们在编程时始终做的事情。这是一种结构化的编程方法。将一个大问题分成更小,更简单的任务。通过解决所有较小的问题来解决这个大问题。
现在,这是解决问题的高级方法,也是在编写解决方案时管理复杂性的一种方法。更简单的任务是高度集中的,几乎是一步到位的块,还是更精细的配方,就像个人选择的编码器一样。使其非常精细,有利于人类的代码可读性(代码维护)以及以小步骤添加功能(再次管理复杂性)。它可能看起来像增加开销,因为你以重复的模式包装非常小的代码块。这是开销,但在这个阶段我们不担心性能,而是代码库的质量(在可读性,可测试性和整体架构方面),顺便说一下,有一个实际工作的解决方案。
问题的低级部分:
接下来,如果您发现您的代码性能不佳(并且您必须量化这是什么),则必须测量或分析代码。
在代码的特定位置插入时间测量值,以查找大部分执行时间的花费,然后尝试更改/优化这些部分。
您对堆栈分配的担忧是非常低级别的问题,请不要将其与整体代码组织等高级问题混在一起。
总结:
首先编写解决方案,稍后再进行优化,并始终通过测量来实现。
作为一个建议性的提示,如果你发现你正在调用几十个函数(以串行方式),试着找到它们之间的相关问题,并尝试通过将一些相关函数分组到模块或类中来对系统进行分区,为代码提供某种空间结构,否则它的结构看起来像一堆(或煎饼),而且在精神上管理也是一件糟糕的事情。
答案 1 :(得分:1)
你的高级主管意味着你不能拥有一个主要功能,它可以调用其他一些功能。在这方面,主要功能也“只做一件事”,即调出实际完成该程序实际工作的其他功能。
在性能方面,功能之间的代码委托根本不是您应该关注的问题。实际上,使用非常少的函数编写结构错误的代码将在Python中产生更好的性能,因为函数调用实际上非常昂贵。不过,你应该不这意味着你应该尝试保持低功能的数量。代码到函数(以及类,模块等)的结构应仅由程序的心理模型决定,而不是性能问题。为此,请关注实际“工作”功能中的算法和实现。