ChatGPT优化Python代码的小技巧

使用优化代码并降低运行时的云成本
许多开发人员说“过早的优化是万恶之源” 。
这句话的来源归功于 Knuth 。在他的书《计算机编程的艺术》中,他写道:
“真正的问题是,程序员在错误的时间和错误的地方花费了太多时间来担心效率;过早的优化是编程中万恶之源 。”
这句话起源于软件开发的早期阶段,当时为了优化目的而重写代码会消耗开发人员的大量时间,但预计只会产生非常有限(如果有的话)的成本节省 。
在当今时代,随着生成的 AI 产品变得越来越容易获得,重写代码成为一项可以非常轻松地完成的任务,借助诸如之类的工具 。
在这个简单的示例中,我将演示如何在不到一分钟的时间内优化一个小的脚本,开发人员方面的工作量最少,同时创造显着减少运行时间的潜力,从而以以下形式产生更具影响力的效果降低云运营成本 。
我采用了一个简单的脚本来读取 HTTP 访问日志文件,作为脚本的参数,然后打印日志中每个 HTTP 响应状态代码的出现次数 。
我从一个非常简单的提问开始:
这是生成的脚本:
import sysfrom collections import defaultdictdef count_status_codes(log_file):status_counts = defaultdict(int)with open(log_file, 'r') as f:for line in f:# Extract the HTTP response status code from each linestatus_code = line.split()[-2]status_counts[status_code] += 1return status_countsif __name__ == '__main__':if len(sys.argv) != 2:print('Usage: python script.py log_file')sys.exit(1)log_file = sys.argv[1]status_counts = count_status_codes(log_file)for status_code, count in status_counts.items():print(f'{status_code}: {count}')
运行原始脚本和生成的脚本后,我注意到一个小差异——我没有要求输出以 JSON 格式生成,所以只生成了一个简单的文本输出:
没过多久,就更新了脚本以创建 JSON 格式的输出 。我问了以下问题:
在更新后,脚本如下所示:
import sysimport jsonfrom collections import defaultdictdef count_status_codes(log_file):status_counts = defaultdict(int)with open(log_file, 'r') as f:for line in f:# Extract the HTTP response status code from each linestatus_code = line.split()[-2]status_counts[status_code] += 1return status_countsif __name__ == '__main__':if len(sys.argv) != 2:print('Usage: python script.py log_file')sys.exit(1)log_file = sys.argv[1]status_counts = count_status_codes(log_file)print(json.dumps(dict(status_counts), indent=4))

ChatGPT优化Python代码的小技巧

文章插图
这次更新后,两个脚本的输出看起来是一样的:
现在是时候向两个脚本添加一些测量并再次运行它们了 。我使用时间模块来测量脚本的运行时间,添加以下代码:
import time## All other imports and function definitions herestart_time = time.time()main()print("--- %s seconds ---" % (time.time() - start_time))
差异惊人:
我们在这里看到的是一个脚本,其功能与原始脚本完全相同,但从运行时的角度来看,性能提高了近 100 倍!
显然,这个例子并没有涵盖所有可能的边缘情况 。例如,如果每个日志条目中的值以非常规顺序写入日志,则此处由生成的代码不支持所需的功能,而原始脚本确实解决了这种情况 。必须在生成的 AI 创建代码后对其进行审查,并确保原始功能没有受到任何损害 。
如本例所示,其含义是压倒性的 。我可以想象各种类似的函数和代码片段在生产系统中作为 AWS函数(或类似资源)运行,每天在大规模操作中被触发数百万次 。