15个提升Python程序运行速度的实用技巧

Written by

in

文章目录
  • Python自带了很多高效的内置函数和库,它们通常比你自己写的代码要快得多。尽量使用这些现成的工具,而不是自己重新发明轮子。 示例: # 不推荐:手动计算列表元素之和 def sum_list_manual(lst): total = 0 for num in lst: total += num return total # 推荐:使用内置sum函数 def sum_list_builtin(lst): return sum(lst) # 测试 numbers = [1, 2, 3, 4, 5] print(sum_list_manual(numbers)) # 输出: 15 print(sum_list_builtin(numbers)) # 输出: 15
  • 列表推导式不仅更简洁,而且执行速度也更快。 示例: # 不推荐:使用for循环创建平方数列表 squares_loop = [] for i in range(10): squares_loop.append(i ** 2) # 推荐:使用列表推导式 squares_comprehension = [i ** 2 for i in range(10)] print(squares_loop) # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] print(squares_comprehension) # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
  • 当你处理大数据集时,生成器表达式可以节省大量内存,因为它只在需要时生成数据。 示例: # 不推荐:使用列表存储所有平方数 squares_list = [i ** 2 for i in range(1000000)] # 推荐:使用生成器表达式 squares_generator = (i ** 2 for i in range(1000000)) # 计算总和 print(sum(squares_list)) # 需要大量内存 print(sum(squares_generator)) # 内存使用较少
  • 集合(set)的数据结构查找元素的时间复杂度是O(1),而列表(list)是O(n)。因此,如果需要频繁进行成员检查,使用set会更快。 示例: # 不推荐:使用列表进行成员检查 my_list = list(range(1000000)) if 999999 in my_list: print(“Found!”) # 推荐:使用集合进行成员检查 my_set = set(range(1000000)) if 999999 in my_set: print(“Found!”)
  • 当有多个条件判断时,可以考虑使用字典来简化代码,并提高效率。 示例: # 不推荐:使用多重if-else def get_grade(score): if score >= 90: return ‘A’ elif score >= 80: return ‘B’ elif score >= 70: return ‘C’ else: return ‘D’ # 推荐:使用字典映射 grade_mapping = { (90, 100): ‘A’, (80, 89): ‘B’, (70, 79): ‘C’, (0, 69): ‘D’ } def get_grade_dict(score): for key, value in grade_mapping.items(): if key[0] <= score <= key[1]: return value print(get_grade(85)) # 输出: B print(get_grade_dict(85)) # 输出: B
  • 局部变量的访问速度比全局变量快。因此,在循环中尽量使用局部变量。 示例: # 不推荐:使用全局变量 global_var = 10 def increment_global(): global global_var for _ in range(1000000): global_var += 1 # 推荐:使用局部变量 def increment_local(): local_var = 10 for _ in range(1000000): local_var += 1 increment_global() # 较慢 increment_local() # 较快
  • 对于耗时的函数调用,可以使用functools.lru_cache来缓存结果,避免重复计算。 示例: import functools # 不推荐:每次调用都重新计算 def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2) # 推荐:使用缓存 @functools.lru_cache(maxsize=None) def fibonacci_cached(n): if n <= 1: return n return fibonacci_cached(n-1) + fibonacci_cached(n-2) print(fibonacci(30)) # 较慢 print(fibonacci_cached(30)) # 较快
  • numpy是一个专门用于科学计算的库,它提供了高效的数组操作功能。 示例: import numpy as np # 不推荐:使用纯Python列表进行矩阵乘法 matrix_a = [[1, 2], [3, 4]] matrix_b = [[5, 6], [7, 8]] result = [[0, 0], [0, 0]] for i in range(len(matrix_a)): for j in range(len(matrix_b[0])): for k in range(len(matrix_b)): result[i][j] += matrix_a[i][k] * matrix_b[k][j] # 推荐:使用numpy进行矩阵乘法 matrix_a_np = np.array(matrix_a) matrix_b_np = np.array(matrix_b) result_np = np.dot(matrix_a_np, matrix_b_np) print(result) # 输出: [[19, 22], [43, 50]] print(result_np) # 输出: [[19 22] [43 50]]
  • pandas是一个强大的数据分析库,特别适合处理表格数据。 示例: import pandas as pd # 不推荐:使用纯Python字典和列表处理数据 data = {‘Name’: [‘Alice’, ‘Bob’, ‘Charlie’], ‘Age’: [25, 30, 35]} ages = [age for age in data[‘Age’] if age > 30] # 推荐:使用pandas处理数据 df = pd.DataFrame(data) filtered_df = df[df[‘Age’] > 30] print(ages) # 输出: [35] print(filtered_df) # 输出: Name Age # 2 Charlie 35
  • 如果你的任务是可以并行化的,那么使用multiprocessing模块可以显著提高性能。 示例: import multiprocessing def square(x): return x ** 2 # 不推荐:串行处理 results_serial = [square(i) for i in range(10)] # 推荐:并行处理 pool = multiprocessing.Pool() results_parallel = pool.map(square, range(10)) pool.close() pool.join() print(results_serial) # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] print(results_parallel) # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
  • 对于I/O密集型任务,使用asyncio可以提高程序的响应速度。 示例: import asyncio async def fetch_data(): await asyncio.sleep(1) return “Data fetched” # 不推荐:同步等待 def sync_fetch(): import time time.sleep(1) return “Data fetched” # 推荐:异步等待 async def main(): result = await fetch_data() print(result) asyncio.run(main()) # 输出: Data fetched
  • cython可以将Python代码编译成C代码,从而提高执行速度。 示例: # 不推荐:纯Python代码 def slow_function(n): return sum(i * i for i in range(n)) # 推荐:使用Cython编译 # 在文件slow_function.pyx中定义 def fast_function(int n): cdef int i, result = 0 for i in range(n): result += i * i return result # 编译并导入 from distutils.core import setup from Cython.Build import cythonize setup(ext_modules=cythonize(“slow_function.pyx”)) from slow_function import fast_function print(slow_function(1000000)) # 较慢 print(fast_function(1000000)) # 较快
  • numba可以通过即时编译技术加速数值计算。 示例: import numba @numba.jit def fast_sum(a, b): return a + b # 不推荐:纯Python加法 def slow_sum(a, b): return a + b print(slow_sum(10, 20)) # 输出: 30 print(fast_sum(10, 20)) # 输出: 30
  • 在优化代码之前,先使用cProfile找出瓶颈所在。 示例: import cProfile def profile_me(): total = 0 for i in range(1000000): total += i return total cProfile.run(‘profile_me()’)
  • line_profiler可以帮助你找到具体哪一行代码最耗时。 示例: # 安装line_profiler # pip install line_profiler @profile def function_to_profile(): a = 2 b = 3 c = a + b return c function_to_profile()
  • 假设你需要编写一个图像处理程序,将一张图片转换为灰度图。我们来看一下如何应用上述技巧来优化这个过程。 原始代码: from PIL import Image def to_grayscale(image_path): image = Image.open(image_path) width, height = image.size grayscale_image = Image.new(‘L’, (width, height)) for x in range(width): for y in range(height): r, g, b = image.getpixel((x, y)) gray = int(0.299 * r + 0.587 * g + 0.114 * b) grayscale_image.putpixel((x, y), gray) grayscale_image.save(‘grayscale.jpg’) to_grayscale(‘input.jpg’) 优化后的代码: import numpy as np from PIL import Image def to_grayscale_optimized(image_path): image = Image.open(image_path).convert(‘RGB’) image_array = np.array(image) grayscale_array = np.dot(image_array[…, :3], [0.299, 0.587, 0.114]).astype(np.uint8) grayscale_image = Image.fromarray(grayscale_array, ‘L’) grayscale_image.save(‘grayscale.jpg’) to_grayscale_optimized(‘input.jpg’) 在这个实战案例中,我们使用了numpy来进行高效的数组操作,避免了显式的双重循环,从而大大提高了程序的运行速度。
  • 本文介绍了15个让Python程序飞速运行的技巧,包括使用内置函数和库、列表推导式、生成器表达式、集合成员检查、字典映射、局部变量、缓存结果、numpy和pandas库、并行和异步处理、cython和numba编译、性能分析工具等。通过这些技巧,你可以写出更高效、更优雅的Python代码。 到此这篇关于15个提升Python程序运行速度的实用技巧的文章就介绍到这了,更多相关Python优化技巧内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Python性能优化之让你的代码运行速度提升10倍的技巧分享 Python加速运行8个优化技巧分享 让Python加速运行的八种实用技巧分享 15个Python运行速度优化技巧分享 7个提高Python代码运行效率的小技巧 让Python代码运行更快的9个小技巧 Python实现提高运行速度的技巧分享
  • 目录
    • 1. 使用内置函数和库
    • 2. 使用列表推导式代替循环
    • 3. 使用生成器表达式节省内存
    • 4. 使用set进行成员检查
    • 5. 使用字典代替多重条件判断
    • 6. 使用局部变量提高性能
    • 7. 使用functools.lru_cache缓存结果
    • 8. 使用numpy处理数值计算
    • 9. 使用pandas处理数据
    • 10. 使用multiprocessing进行并行处理
    • 11. 使用asyncio进行异步编程
    • 12. 使用cython编译Python代码
    • 13. 使用numba加速数值计算
    • 14. 使用cProfile进行性能分析
    • 15. 使用line_profiler进行逐行分析
    • 实战案例:优化图像处理算法
    • 总结

    今天我们就来聊聊如何用15个技巧让Python程序飞速运行。这些技巧不仅能让代码跑得更快,还能让你的编程思维更加严谨。

    Python自带了很多高效的内置函数和库,它们通常比你自己写的代码要快得多。尽量使用这些现成的工具,而不是自己重新发明轮子。

    示例:

    # 不推荐:手动计算列表元素之和
    def sum_list_manual(lst):
        total = 0
        for num in lst:
            total += num
        return total
    
    # 推荐:使用内置sum函数
    def sum_list_builtin(lst):
        return sum(lst)
    
    # 测试
    numbers = [1, 2, 3, 4, 5]
    print(sum_list_manual(numbers))  # 输出: 15
    print(sum_list_builtin(numbers))  # 输出: 15
    

    列表推导式不仅更简洁,而且执行速度也更快。

    示例:

    # 不推荐:使用for循环创建平方数列表
    squares_loop = []
    for i in range(10):
        squares_loop.append(i ** 2)
    
    # 推荐:使用列表推导式
    squares_comprehension = [i ** 2 for i in range(10)]
    
    print(squares_loop)  # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    print(squares_comprehension)  # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    

    当你处理大数据集时,生成器表达式可以节省大量内存,因为它只在需要时生成数据。

    示例:

    # 不推荐:使用列表存储所有平方数
    squares_list = [i ** 2 for i in range(1000000)]
    
    # 推荐:使用生成器表达式
    squares_generator = (i ** 2 for i in range(1000000))
    
    # 计算总和
    print(sum(squares_list))  # 需要大量内存
    print(sum(squares_generator))  # 内存使用较少
    

    集合(set)的数据结构查找元素的时间复杂度是O(1),而列表(list)是O(n)。因此,如果需要频繁进行成员检查,使用set会更快。

    示例:

    # 不推荐:使用列表进行成员检查
    my_list = list(range(1000000))
    if 999999 in my_list:
        print("Found!")
    
    # 推荐:使用集合进行成员检查
    my_set = set(range(1000000))
    if 999999 in my_set:
        print("Found!")
    

    当有多个条件判断时,可以考虑使用字典来简化代码,并提高效率。

    示例:

    # 不推荐:使用多重if-else
    def get_grade(score):
        if score >= 90:
            return 'A'
        elif score >= 80:
            return 'B'
        elif score >= 70:
            return 'C'
        else:
            return 'D'
    
    # 推荐:使用字典映射
    grade_mapping = {
        (90, 100): 'A',
        (80, 89): 'B',
        (70, 79): 'C',
        (0, 69): 'D'
    }
    
    def get_grade_dict(score):
        for key, value in grade_mapping.items():
            if key[0] <= score <= key[1]:
                return value
    
    print(get_grade(85))  # 输出: B
    print(get_grade_dict(85))  # 输出: B
    

    局部变量的访问速度比全局变量快。因此,在循环中尽量使用局部变量。

    示例:

    # 不推荐:使用全局变量
    global_var = 10
    def increment_global():
        global global_var
        for _ in range(1000000):
            global_var += 1
    
    # 推荐:使用局部变量
    def increment_local():
        local_var = 10
        for _ in range(1000000):
            local_var += 1
    
    increment_global()  # 较慢
    increment_local()   # 较快
    

    对于耗时的函数调用,可以使用functools.lru_cache来缓存结果,避免重复计算。

    示例:

    import functools
    
    # 不推荐:每次调用都重新计算
    def fibonacci(n):
        if n <= 1:
            return n
        return fibonacci(n-1) + fibonacci(n-2)
    
    # 推荐:使用缓存
    @functools.lru_cache(maxsize=None)
    def fibonacci_cached(n):
        if n <= 1:
            return n
        return fibonacci_cached(n-1) + fibonacci_cached(n-2)
    
    print(fibonacci(30))  # 较慢
    print(fibonacci_cached(30))  # 较快
    

    numpy是一个专门用于科学计算的库,它提供了高效的数组操作功能。

    示例:

    import numpy as np
    
    # 不推荐:使用纯Python列表进行矩阵乘法
    matrix_a = [[1, 2], [3, 4]]
    matrix_b = [[5, 6], [7, 8]]
    
    result = [[0, 0], [0, 0]]
    for i in range(len(matrix_a)):
        for j in range(len(matrix_b[0])):
            for k in range(len(matrix_b)):
                result[i][j] += matrix_a[i][k] * matrix_b[k][j]
    
    # 推荐:使用numpy进行矩阵乘法
    matrix_a_np = np.array(matrix_a)
    matrix_b_np = np.array(matrix_b)
    result_np = np.dot(matrix_a_np, matrix_b_np)
    
    print(result)  # 输出: [[19, 22], [43, 50]]
    print(result_np)  # 输出: [[19 22] [43 50]]
    

    pandas是一个强大的数据分析库,特别适合处理表格数据。

    示例:

    import pandas as pd
    
    # 不推荐:使用纯Python字典和列表处理数据
    data = {'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35]}
    ages = [age for age in data['Age'] if age > 30]
    
    # 推荐:使用pandas处理数据
    df = pd.DataFrame(data)
    filtered_df = df[df['Age'] > 30]
    
    print(ages)  # 输出: [35]
    print(filtered_df)  # 输出:      Name  Age
                     # 2  Charlie   35
    

    如果你的任务是可以并行化的,那么使用multiprocessing模块可以显著提高性能。

    示例:

    import multiprocessing
    
    def square(x):
        return x ** 2
    
    # 不推荐:串行处理
    results_serial = [square(i) for i in range(10)]
    
    # 推荐:并行处理
    pool = multiprocessing.Pool()
    results_parallel = pool.map(square, range(10))
    pool.close()
    pool.join()
    
    print(results_serial)  # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    print(results_parallel)  # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    

    对于I/O密集型任务,使用asyncio可以提高程序的响应速度。

    示例:

    import asyncio
    
    async def fetch_data():
        await asyncio.sleep(1)
        return "Data fetched"
    
    # 不推荐:同步等待
    def sync_fetch():
        import time
        time.sleep(1)
        return "Data fetched"
    
    # 推荐:异步等待
    async def main():
        result = await fetch_data()
        print(result)
    
    asyncio.run(main())  # 输出: Data fetched
    

    cython可以将Python代码编译成C代码,从而提高执行速度。

    示例:

    # 不推荐:纯Python代码
    def slow_function(n):
        return sum(i * i for i in range(n))
    
    # 推荐:使用Cython编译
    # 在文件slow_function.pyx中定义
    def fast_function(int n):
        cdef int i, result = 0
        for i in range(n):
            result += i * i
        return result
    
    # 编译并导入
    from distutils.core import setup
    from Cython.Build import cythonize
    
    setup(ext_modules=cythonize("slow_function.pyx"))
    
    from slow_function import fast_function
    
    print(slow_function(1000000))  # 较慢
    print(fast_function(1000000))  # 较快
    

    numba可以通过即时编译技术加速数值计算。

    示例:

    import numba
    
    @numba.jit
    def fast_sum(a, b):
        return a + b
    
    # 不推荐:纯Python加法
    def slow_sum(a, b):
        return a + b
    
    print(slow_sum(10, 20))  # 输出: 30
    print(fast_sum(10, 20))  # 输出: 30
    

    在优化代码之前,先使用cProfile找出瓶颈所在。

    示例:

    import cProfile
    
    def profile_me():
        total = 0
        for i in range(1000000):
            total += i
        return total
    
    cProfile.run('profile_me()')
    

    line_profiler可以帮助你找到具体哪一行代码最耗时。

    示例:

    # 安装line_profiler
    # pip install line_profiler
    
    @profile
    def function_to_profile():
        a = 2
        b = 3
        c = a + b
        return c
    
    function_to_profile()
    

    假设你需要编写一个图像处理程序,将一张图片转换为灰度图。我们来看一下如何应用上述技巧来优化这个过程。

    原始代码:

    from PIL import Image
    
    def to_grayscale(image_path):
        image = Image.open(image_path)
        width, height = image.size
        grayscale_image = Image.new('L', (width, height))
    
        for x in range(width):
            for y in range(height):
                r, g, b = image.getpixel((x, y))
                gray = int(0.299 * r + 0.587 * g + 0.114 * b)
                grayscale_image.putpixel((x, y), gray)
    
        grayscale_image.save('grayscale.jpg')
    
    to_grayscale('input.jpg')
    

    优化后的代码:

    import numpy as np
    from PIL import Image
    
    def to_grayscale_optimized(image_path):
        image = Image.open(image_path).convert('RGB')
        image_array = np.array(image)
        grayscale_array = np.dot(image_array[..., :3], [0.299, 0.587, 0.114]).astype(np.uint8)
        grayscale_image = Image.fromarray(grayscale_array, 'L')
        grayscale_image.save('grayscale.jpg')
    
    to_grayscale_optimized('input.jpg')
    

    在这个实战案例中,我们使用了numpy来进行高效的数组操作,避免了显式的双重循环,从而大大提高了程序的运行速度。

    本文介绍了15个让Python程序飞速运行的技巧,包括使用内置函数和库、列表推导式、生成器表达式、集合成员检查、字典映射、局部变量、缓存结果、numpypandas库、并行和异步处理、cythonnumba编译、性能分析工具等。通过这些技巧,你可以写出更高效、更优雅的Python代码。

    到此这篇关于15个提升Python程序运行速度的实用技巧的文章就介绍到这了,更多相关Python优化技巧内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • Python性能优化之让你的代码运行速度提升10倍的技巧分享
    • Python加速运行8个优化技巧分享
    • 让Python加速运行的八种实用技巧分享
    • 15个Python运行速度优化技巧分享
    • 7个提高Python代码运行效率的小技巧
    • 让Python代码运行更快的9个小技巧
    • Python实现提高运行速度的技巧分享

    站内搜索