我正在使用Python和C编写一款科学程序,其中包含一些复杂的物理模拟算法。在实现算法之后,我发现有很多可能的优化方法可以提高程序性能,例如预计算值、将计算从周期中取出、用更复杂的矩阵算法替换简单的算法等。但是问题也随之而来:未经过优化的算法速度较慢,但是其逻辑和与理论的联系更加清晰易懂,而优化后的算法则更难扩展和修改。
因此,问题是 - 我应该使用什么技术来在提高性能的同时保持可读性?现在我正在尝试并行开发快速和清晰的分支,但也许还有更好的方法?
我正在使用Python和C编写一款科学程序,其中包含一些复杂的物理模拟算法。在实现算法之后,我发现有很多可能的优化方法可以提高程序性能,例如预计算值、将计算从周期中取出、用更复杂的矩阵算法替换简单的算法等。但是问题也随之而来:未经过优化的算法速度较慢,但是其逻辑和与理论的联系更加清晰易懂,而优化后的算法则更难扩展和修改。
因此,问题是 - 我应该使用什么技术来在提高性能的同时保持可读性?现在我正在尝试并行开发快速和清晰的分支,但也许还有更好的方法?
通常人们认为要追求性能就必须牺牲可读性。
但这并非一定如此。
你需要找出程序在做什么,以及为什么会花费大量时间。
注意,我没有说你需要进行任何测量。
很有可能你只需进行一些简单的更改就能避免浪费运算,但在程序自身告诉你需要修复什么之前不要进行任何修复。
def whatYouShouldDo(servings, integration_method=oven):
"""
Make chicken soup
"""
# Comments:
# They are important. With some syntax highlighting, the comments are
# the first thing a new programmer will look for. Therefore, they should
# motivate your algorithm, outline it, and break it up into stages.
# You can MAKE IT FEEL AS IF YOU ARE READING TEXT, interspersing code
# amongst the text.
#
# Algorithm overview:
# To make chicken soup, we will acquire chicken broth and some noodles.
# Preprocessing ingredients is done to optimize cooking time. Then we
# will output in SOUP format via stdout.
#
# BEGIN ALGORITHM
#
# Preprocessing:
# 1. Thaw chicken broth.
broth = chickenstore.deserialize()
# 2. Mix with noodles
if not noodles in cache:
with begin_transaction(locals=poulty) as t:
cache[noodles] = t.buy(noodles) # get from local store
noodles = cache[noodles]
# 3. Perform 4th-order Runge-Kutta numerical integration
import kitchensink import * # FIXME: poor form, better to from kitchensink import pan at beginning
result = boilerplate.RK4(broth `semidirect_product` noodles)
# 4. Serve hot
log.debug('attempting to serve')
return result
log.debug('server successful')
还可以参见http://en.wikipedia.org/wiki/Literate_programming#Example
我也听说http://en.wikipedia.org/wiki/Aspect-oriented_programming试图帮助解决这个问题,不过我还没有真正研究过它。 (它似乎只是一种花哨的方式来说“将您的优化、调试和其他杂项放在您正在编写的函数之外”。)