这个小 Python 脚本提高了对低级编程的理解

wufei123 2025-01-26 阅读:62 评论:0
最初发布于 Medium 上的 Level Up Coding。 Python 以其简洁易用而闻名,但对于许多开发者来说,在某个阶段,语言本身的学习曲线会趋于平缓。一旦掌握了常用库和技术,解决问题就变得程式化。然而,学习之旅永无止境,尤...

这个小 python 脚本提高了对低级编程的理解

最初发布于 Medium 上的 Level Up Coding。

Python 以其简洁易用而闻名,但对于许多开发者来说,在某个阶段,语言本身的学习曲线会趋于平缓。一旦掌握了常用库和技术,解决问题就变得程式化。然而,学习之旅永无止境,尤其是在深入研究并发和底层编程等高级主题时。

对于希望提升 Python 技能的开发者来说,一个宝贵的资源是 Talk Python To Me 播客,它涵盖了 Python 开发的诸多方面。其中一期课程,“使用异步/等待和线程的 Python 并行编程”,深入探讨了处理并发和优化代码执行的关键概念。

传统的计算机科学教育中,会涉及计算机体系结构、C 编程、互斥锁、信号量和指针等内容。然而,许多开发者从未将这些概念与实际编程场景联系起来。例如,对 CPU 内核的理解往往停留在抽象层面,与日常开发任务脱节。

本课程的一个重点是 Unsync 库的使用。它将异步、线程和多进程整合到统一的 API 中,简化了并发和并行编程。该库能根据任务是 CPU 密集型、I/O 密集型还是异步型来自动优化任务执行。通过消除线程启动、加入和关闭的复杂性,Unsync 库使得 Python 的并发编程更易于上手且更高效。

以下脚本演示了这些概念:

PHP
# source: https://github.com/talkpython/async-techniques-python-course/blob/master/src/09-built-on-asyncio/the_unsync/thesync.py

import datetime
import math
import asyncio
import aiohttp
import requests
from unsync import unsync

def main():
    t0 = datetime.datetime.now()

    tasks = [
        compute_some(),
        compute_some(),
        compute_some(),
        download_some(),
        download_some(),
        download_some_more(),
        download_some_more(),
        wait_some(),
        wait_some(),
        wait_some(),
        wait_some(),
    ]

    [t.result() for t in tasks]

    dt = datetime.datetime.now() - t0
    print(f"Synchronous version done in {dt.total_seconds():,.2f} seconds.")

@unsync(cpu_bound=True)
def compute_some():
    print("Computing...")
    for _ in range(1, 10_000_000):
        math.sqrt(25 ** 25 + .01)

@unsync()
async def download_some():
    print("Downloading...")
    url = 'https://talkpython.fm/episodes/show/174/coming-into-python-from-another-industry-part-2'
    async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=False)) as session:
        async with session.get(url) as resp:
            resp.raise_for_status()
            text = await resp.text()
    print(f"Downloaded (more) {len(text):,} characters.")

@unsync()
def download_some_more():
    print("Downloading more ...")
    url = 'https://pythonbytes.fm/episodes/show/92/will-your-python-be-compiled'
    resp = requests.get(url)
    resp.raise_for_status()
    text = resp.text
    print(f"Downloaded {len(text):,} characters.")

@unsync()
async def wait_some():
    print("Waiting...")
    for _ in range(1, 1000):
        await asyncio.sleep(.001)

if __name__ == "__main__":
    main()
脚本解析

该脚本展示了不同类型的任务以及如何并发执行它们以提升性能和效率:

  1. compute_some 函数: 模拟密集型计算,通过计算大量数字来演示多线程处理如何利用多个 CPU 核心进行并行计算,从而缩短处理时间,提升效率。实际应用包括数值模拟、数据分析和计算密集型操作。
  2. download_some 函数: 演示异步获取数据(例如,从 API 或网站)。它在 asyncio 事件循环中运行,允许非阻塞 I/O 操作。这使其非常适合处理多个并发 I/O 任务,例如数据抓取或并发 API 请求。
  3. download_some_more 函数: 演示同步 HTTP 请求的使用。虽然是同步的,但它在单独的线程中运行,避免阻塞主线程。此方法适用于不需要非阻塞操作但仍需并发的简单或遗留系统。
  4. wait_some 函数: 模拟异步任务中的非阻塞暂停,允许其他任务在等待时继续运行。这在程序需要等待外部事件、计时器或用户输入而不阻塞其他操作的场景中非常有用。
关键点

通过并发编程,该脚本展示了如何同时执行多个任务,从而加快处理速度并更有效地利用资源。

在编程中,内存 (RAM) 和处理能力 (CPU) 是影响性能的关键因素。RAM 提供对活动数据的快速访问,支持多个任务的顺利执行;CPU 处理指令和计算的执行。在实际应用中,充足的内存确保能同时处理大型数据集或多个操作,强大的 CPU 则带来更快的计算和更灵敏的应用程序。

理解内存、CPU 和并发之间的关系,对开发者进行优化和任务执行至关重要。通过利用多核 CPU 和高效的内存管理,开发者可以创建响应更快、高性能的应用程序,轻松处理复杂的数据密集型任务。

图片来自 Alexander Kovalev

以上就是这个小 Python 脚本提高了对低级编程的理解的详细内容,更多请关注知识资源分享宝库其它相关文章!

版权声明

本站内容来源于互联网搬运,
仅限用于小范围内传播学习,请在下载后24小时内删除,
如果有侵权内容、不妥之处,请第一时间联系我们删除。敬请谅解!
E-mail:dpw1001@163.com

分享:

扫一扫在手机阅读、分享本文

发表评论
热门文章
  • BioWare埃德蒙顿工作室面临关闭危机,龙腾世纪制作总监辞职引关注(龙腾.总监.辞职.危机.面临.....)

    BioWare埃德蒙顿工作室面临关闭危机,龙腾世纪制作总监辞职引关注(龙腾.总监.辞职.危机.面临.....)
    知名变性人制作总监corrine busche离职bioware,引发业界震荡!外媒“smash jt”独家报道称,《龙腾世纪:影幢守护者》制作总监corrine busche已离开bioware,此举不仅引发了关于个人职业发展方向的讨论,更因其可能预示着bioware埃德蒙顿工作室即将关闭而备受关注。本文将深入分析busche离职的原因及其对bioware及游戏行业的影响。 Busche的告别信:挑战与感激并存 据“Smash JT”获得的内部邮件显示,Busche离职原...
  • boss直聘怎么取消面试预约 boss直聘上面试爽约了会怎么样(面试.爽约.预约.取消.boss.....)

    boss直聘怎么取消面试预约 boss直聘上面试爽约了会怎么样(面试.爽约.预约.取消.boss.....)
    求职宝典:boss直聘面试技巧及取消预约方法 各位求职者注意啦!在Boss直聘上,随意取消面试预约会留下爽约记录,影响后续求职!本文将指导您如何避免爽约,以及如何取消已预约的面试。 如何取消Boss直聘面试预约? 打开Boss直聘APP,进入“我的”页面。 点击“待面试”,查看面试日程。 选择需要取消的面试,点击“取消面试”按钮即可。 Boss直聘面试爽约的后果? 爽约行为会在HR端留下记录,影响您的求职成功率。其他HR也能看到您的不良记录,所以务必重视面试预约。...
  • 闪耀暖暖靡城永恒怎么样-闪耀暖暖靡城永恒套装介绍(闪耀.暖暖.套装.介绍.....)

    闪耀暖暖靡城永恒怎么样-闪耀暖暖靡城永恒套装介绍(闪耀.暖暖.套装.介绍.....)
    闪耀暖暖钻石竞技场第十七赛季“华梦泡影”即将开启!全新闪耀性感套装【靡城永恒】震撼来袭!想知道如何获得这套精美套装吗?快来看看吧! 【靡城永恒】套装设计理念抢先看: 设计灵感源于夜色中的孤星,象征着淡然、漠视一切的灰色瞳眸。设计师希望通过这套服装,展现出在虚幻与真实交织的夜幕下,一种独特的魅力。 服装细节考究,从面料的光泽、鞋跟声响到裙摆的弧度,都力求完美还原设计初衷。 【靡城永恒】套装设计亮点: 闪耀的绸缎与金丝交织,轻盈的羽毛增添华贵感。 这套服装仿佛是从无尽的黑...
  • 蛋仔派对2025最新皮肤兑换码汇总 最新皮肤兑换码一览(兑换.皮肤.最新.派对.汇总.....)

    蛋仔派对2025最新皮肤兑换码汇总 最新皮肤兑换码一览(兑换.皮肤.最新.派对.汇总.....)
    蛋仔派对2025最新皮肤兑换码大放送!游戏内新增多款皮肤兑换码,包含最新、福利和通用三种类型,助你轻松获取精美奖励! 赶紧来看看如何兑换吧! 兑换码列表: 最新兑换码: ccewndj4k4k、cdkqdfm4fh、peetnmp4ef、cdxymk8f67 福利兑换码: cca863ywtfa、eggy2310am、eggy2311gz、eggyeggy9wz 通用兑换码: pec74dkcty、jsrqkrrjmh、cd3wt7wrph、ccepn7d8cjf...
  • python怎么调用其他文件函数

    python怎么调用其他文件函数
    在 python 中调用其他文件中的函数,有两种方式:1. 使用 import 语句导入模块,然后调用 [模块名].[函数名]();2. 使用 from ... import 语句从模块导入特定函数,然后调用 [函数名]()。 如何在 Python 中调用其他文件中的函数 在 Python 中,您可以通过以下两种方式调用其他文件中的函数: 1. 使用 import 语句 优点:简单且易于使用。 缺点:会将整个模块导入到当前作用域中,可能会导致命名空间混乱。 步骤:...