返回

编码实践随想:注重性能和算法稳定性

闲谈

编码实践随想:李迟 2022 年 7 月工作生活总结

工作

近来编码,基本都是业务、自动化测试相关的,在写代码时,主要考虑便捷性,快速出结果。性能方面不怎么考虑。像写C++,如果没有什么特殊的要求,字符串都直接用 std::string,方便嘛。但这段时间遇到了一些问题,需要考虑性能,才发现自己以前很多编码习惯并不太好。

像平时写Python脚本,都是直接用 += 来拼接字符串。这次用 Python 写自动化测试脚本,测试比较耗时,而且遇到了内存泄漏的问题。花了点时间定位问题,发现就是字符串拼接的问题。Python 字符串是不可变的,每次 += 操作,都会产生一个新的字符串对象,导致内存泄漏。

在 Python 中,字符串拼接的正确姿势是使用 join() 函数。join() 函数不会产生新的字符串对象,而是直接修改原有字符串。这样就不会导致内存泄漏。

# 错误的写法
s = ""
for i in range(100000):
    s += str(i)

# 正确的写法
s = []
for i in range(100000):
    s.append(str(i))
s = "".join(s)

类似的,在 C++ 中,字符串拼接也应该使用 += 而不是 ++ 操作符会产生一个新的字符串对象,而 += 操作符不会。

# 错误的写法
std::string s;
for (int i = 0; i < 100000; i++) {
    s = s + std::to_string(i);
}

# 正确的写法
std::string s;
for (int i = 0; i < 100000; i++) {
    s += std::to_string(i);
}

通过这次经历,我意识到自己在编码时,应该更加注重性能。不能只考虑快速出结果,还要考虑代码的效率和可维护性。

生活

7 月份,我参加了一个编程比赛。比赛题目是设计一个算法,给定一个数组,求出数组中所有子数组的和的最大值。

我一开始想到的是暴力解法,时间复杂度是 O(n^3)。后来我发现,这个问题可以用分治法来解决,时间复杂度可以降到 O(n log n)。

比赛中,我的代码没有通过所有测试用例,原因是算法不稳定。比赛结束后,我花了一段时间分析了代码,找到了问题所在。

通过这次比赛,我学到了很多东西。首先,我了解到分治法是一种非常强大的算法设计方法。其次,我意识到算法的稳定性也很重要。

7 月份,我还读了几本书。其中一本是《算法导论》。这本书非常经典,内容丰富,讲解深入。我学到了很多算法知识,对我的编码实践也有很大的帮助。

另一本书是《代码整洁之道》。这本书主要讲的是代码的编写风格。我学到了很多代码编写技巧,提高了我的代码可读性和可维护性。

7 月份,我过得非常充实。我在工作和生活中都学到了很多东西。我期待着 8 月份的到来,希望自己能够继续进步。