久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Python 高階升級(jí)技巧

 黃爸爸好 2024-07-25


圖片

廢話不多說,,下面介紹幾個(gè)python高階技巧,,突破思維限制。

技巧 1:利用迭代器和生成器的力量

如果你對(duì) Python 的核心原理了如指掌,,那么你很可能對(duì)迭代器和生成器的基礎(chǔ)知識(shí)了如指掌,。生成器是Python中的一個(gè)重要特性,它可以使用yield語句來生成一個(gè)可迭代對(duì)象,,我們進(jìn)一步深入探討它們的功能,。想象一下:你需要篩選一個(gè)長達(dá)數(shù)百萬行的大型日志文件。試圖將整個(gè)文件加載到內(nèi)存中將會(huì)帶來災(zāi)難性的后果,。這時(shí),,生成器就能派上大用了!

代碼示例

常用方法

def process_huge_file(filename):
    all_lines = open(filename).readlines()  # Yikes!一次加載所有內(nèi)容
    results = []
    for line in all_lines:
        # 對(duì)每一行進(jìn)行處理
        results.append(process_line(line)) 
    return results

高階技巧

def process_huge_file_generator(filename):
    with open(filename) as f:
        for line in f:
            yield process_line(line)  # 按需處理,,無巨型列表

# 使用生成器
for result in process_huge_file_generator('massive_log.txt'):
    # 對(duì)每個(gè)結(jié)果進(jìn)行處理

注意到了不同之處,?

生成器方法逐一處理文件,并根據(jù)需要生成結(jié)果,。即使面臨大量數(shù)據(jù)集,,也能保持正常的內(nèi)存使用率。這是眾多大廠處理大規(guī)模數(shù)據(jù)的核心原則--規(guī)模效率,。

想要更加復(fù)雜嗎,?

將生成器連鎖起來,構(gòu)建出優(yōu)雅的數(shù)據(jù)處理管道,!

生成器連鎖是一種非常強(qiáng)大的數(shù)據(jù)處理技術(shù),,它可以幫助我們構(gòu)建出高效、優(yōu)雅的數(shù)據(jù)處理管道,。通過將生成器連鎖在一起,,我們可以構(gòu)建出復(fù)雜的數(shù)據(jù)處理流程,而不需要一次性將全部數(shù)據(jù)加載到內(nèi)存中,。

要構(gòu)建優(yōu)雅的數(shù)據(jù)處理管道,,你可以使用生成器和管道操作符(如|)來連鎖起來。生成器是一種特殊的迭代器,,可以逐步生成數(shù)據(jù),,而管道操作符可以將生成器連接起來,將一個(gè)生成器的輸出作為下一個(gè)生成器的輸入,。

# 創(chuàng)建一個(gè)生成器,,生成一系列數(shù)字
def number_generator(n):
    for i in range(1, n + 1):
        yield i

# 創(chuàng)建一個(gè)生成器,對(duì)接收的數(shù)字進(jìn)行平方
def square_generator(nums):
    for num in nums:
        yield num * num

# 創(chuàng)建一個(gè)生成器,,對(duì)接收的數(shù)字進(jìn)行累加
def sum_generator(nums):
    total = 0
    for num in nums:
        total += num
        yield total

# 使用管道操作符連接生成器,,構(gòu)建數(shù)據(jù)處理管道
result = number_generator(5) | square_generator | sum_generator

# 遍歷處理結(jié)果
for value in result:
    print(value)

在這個(gè)例子中,我們首先創(chuàng)建了三個(gè)生成器number_generator,、square_generatorsum_generator,,分別用來生成數(shù)字、對(duì)數(shù)字進(jìn)行平方和對(duì)數(shù)字進(jìn)行累加,。然后使用管道操作符將它們連接起來,,構(gòu)建出一個(gè)數(shù)據(jù)處理管道。最后遍歷處理結(jié)果,,可以看到數(shù)據(jù)依次經(jīng)過三個(gè)生成器的處理,。

通過這種方式,你可以構(gòu)建出優(yōu)雅的數(shù)據(jù)處理管道,,利用生成器和管道操作符來實(shí)現(xiàn)數(shù)據(jù)處理流程的組合和重用,。

這里還有個(gè)讀取文件的例子,。沒有直接使用管道符'|'

# 定義第一個(gè)生成器,用于讀取文件中的數(shù)據(jù)
def read_file(filename):
    with open(filename, 'r'as file:
        for line in file:
            yield line

# 定義第二個(gè)生成器,,用于對(duì)文本進(jìn)行處理
def process_text(lines):
    for line in lines:
        # 在這里可以進(jìn)行各種文本處理操作,,比如分詞、去除停用詞等
        # 這里簡(jiǎn)單示范將每行轉(zhuǎn)換為大寫
        yield line.upper()

# 定義第三個(gè)生成器,,用于輸出處理后的數(shù)據(jù)
def write_to_file(lines, output_filename):
    with open(output_filename, 'w'as file:
        for line in lines:
            file.write(line)

# 將生成器連鎖起來構(gòu)建數(shù)據(jù)處理管道
input_file = 'input.txt'
output_file = 'output.txt'

data = read_file(input_file)
processed_data = process_text(data)
write_to_file(processed_data, output_file)

在這個(gè)示例中,,read_file函數(shù)從文件中逐行讀取數(shù)據(jù)并返回生成器,process_text函數(shù)對(duì)每行文本進(jìn)行處理并返回生成器,,write_to_file函數(shù)將處理后的數(shù)據(jù)寫入到文件中,。通過將這些生成器連鎖在一起,我們構(gòu)建了一個(gè)優(yōu)雅的數(shù)據(jù)處理管道,,使得我們可以高效地處理大規(guī)模的數(shù)據(jù)而不需要一次性將全部數(shù)據(jù)加載到內(nèi)存中,。

更多優(yōu)質(zhì)內(nèi)容,請(qǐng)關(guān)注@公眾號(hào):數(shù)據(jù)STUDIO

技巧 2:利用裝飾器提升技能

如果你曾經(jīng)對(duì)裝飾器感到頭昏腦漲,,那就大錯(cuò)特錯(cuò)了,。起初它們可能看起來像魔法一般,但實(shí)際上它們只是你能夠添加到函數(shù)上的一些花哨附加組件,。需要計(jì)算函數(shù)的運(yùn)行時(shí)間,?有一個(gè)裝飾器能夠解決這個(gè)問題。想要添加日志記錄,?再來一個(gè)裝飾器,!這就好比讓函數(shù)獲得了超能力一樣。

關(guān)鍵在于裝飾器可以幫助你擺脫編寫重復(fù)模板代碼的困擾,。需要對(duì)多個(gè)函數(shù)執(zhí)行相同的設(shè)置步驟,?一個(gè)巧妙設(shè)計(jì)的裝飾器就能夠解決這個(gè)問題。就像給編碼過程添上了一件時(shí)髦新衣一樣,,迅速變得更有趣了,。

裝飾器示例

def my_timer(func):
    import time
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f'{func.__name__} took: {end-start:.4f} seconds')
        return result
    return wrapper

@my_timer  # Look, no messy setup!
def slow_function(n):
    time.sleep(n)

裝飾器雖好,但不要過度使用

裝飾符非常棒,,但就像你不會(huì)穿著燕尾服去雜貨店一樣,,要明智地使用它們。過多的裝飾會(huì)讓你的代碼更難理解,。

技巧 3:發(fā)揮多進(jìn)程的作用

您的電腦在執(zhí)行哪些任務(wù)時(shí)運(yùn)轉(zhuǎn)不暢呢?如果您一直在等待計(jì)算完成或處理大量文件,,那么利用多進(jìn)程處理將大大提升速度,。原理是這樣的:大多數(shù)現(xiàn)代電腦都擁有多個(gè) CPU 內(nèi)核,但往往沒有得到充分利用,。多核處理器能充分發(fā)揮它們的作用,!

使用多核處理器的時(shí)機(jī):CPU密集型任務(wù)

  • CPU密集型任務(wù)包括嚴(yán)格的數(shù)值計(jì)算,、圖像處理和復(fù)雜的模擬。如果電腦的 CPU 是限制因素,,那么多核處理器可能是一個(gè)解決方案,。
  • 獨(dú)立任務(wù):你的問題是否能夠分解成可以同時(shí)處理的小塊?這時(shí)非常適合使用多處理,。

代碼示例:并行

假設(shè)你需要調(diào)整一大批圖片的大小,。每張圖片都可以獨(dú)立處理,這就是典型的多處理方案:

import multiprocessing

def resize_image(image_path):
    # (Your image resizing code here)
    ...

if __name__ == '__main__':
    image_paths = [...]  # Load your list of image files
    with multiprocessing.Pool() as pool:  # Create a worker pool
        pool.map(resize_image, image_paths)  # Magic happens here!

為何這么重要

pool.map函數(shù)可以神奇地將圖像大小調(diào)整工作分配給所有可用的CPU內(nèi)核,。以往需要花費(fèi)很長時(shí)間的工作,,現(xiàn)在只需很短的時(shí)間就能完成。

多處理是Python出色擴(kuò)展的一種方式,。但請(qǐng)記住,,它并非適用于所有情況。比如網(wǎng)絡(luò)綁定任務(wù)(等待網(wǎng)站響應(yīng))就無法獲得同樣的好處,。了解何時(shí)使用多處理(何時(shí)不使用)才是真正的力量源泉,。

技巧 4:重視代碼測(cè)試

在高質(zhì)量的軟件開發(fā)過程中,代碼測(cè)試是一個(gè)關(guān)鍵且不可或缺的環(huán)節(jié),。未經(jīng)嚴(yán)格測(cè)試的代碼就如一枚定時(shí)炸彈,,隨時(shí)可能導(dǎo)致項(xiàng)目功能異常和聲譽(yù)受損。因此,,從一開始就應(yīng)當(dāng)培養(yǎng)良好的測(cè)試習(xí)慣,,而不是等到問題發(fā)生后不得不事后補(bǔ)救。

測(cè)試的重要性:

  • 盡早發(fā)現(xiàn)缺陷:問題被及時(shí)發(fā)現(xiàn),,修復(fù)的成本就越低,。
  • 自信編寫代碼:測(cè)試為代碼修改和重構(gòu)提供了安全保障,無需過度擔(dān)憂,。
  • 睡眠質(zhì)量改善:確保系統(tǒng)按預(yù)期運(yùn)行,,可以減輕開發(fā)者的精神壓力。

測(cè)試失敗導(dǎo)致的教訓(xùn)

我之所以如此重視測(cè)試,,是由于曾經(jīng)的一次深刻教訓(xùn),。之前有一次,一個(gè)同事為了快速開發(fā)新功能而忽視了測(cè)試環(huán)節(jié),,結(jié)果一個(gè)看似微小的改動(dòng)引發(fā)了連鎖反應(yīng),,導(dǎo)致系統(tǒng)的其他無關(guān)部分發(fā)生嚴(yán)重崩潰。那次事故讓同事焦頭爛額地修復(fù)了一個(gè)下午,,從那以后,,我就成為了測(cè)試的堅(jiān)定擁護(hù)者。

使用 Python 的 unittest 的簡(jiǎn)單示例

import unittest

def calculate_average(numbers):
    if len(numbers) == 0:
        return 0  # Return 0 for empty lists to avoid division by zero
    return sum(numbers) / len(numbers)

class TestAverage(unittest.TestCase):
    def test_empty_list(self):
        result = calculate_average([])
        self.assertEqual(result, 0)

    def test_basic_average(self):
        result = calculate_average([246])
        self.assertEqual(result, 4)

if __name__ == '__main__':
    unittest.main()

從小處做起,,覆蓋代碼的關(guān)鍵部分,,并不斷擴(kuò)展測(cè)試,。這是一項(xiàng)會(huì)帶來十倍回報(bào)的投資。

技巧 5:采用異步方式,,提升速度

生活并非總是按部就班,、有條不紊地進(jìn)行。有時(shí),,你會(huì)發(fā)現(xiàn)自己需要等待網(wǎng)頁加載,、文件下載完成或數(shù)據(jù)庫查詢結(jié)束。這就是異步編程概念的用武之地,,它允許你同時(shí)管理多個(gè)活動(dòng),。跟更多內(nèi)容可閱讀??Python 最強(qiáng)異步編程:Asyncio

為何選擇異步編程?

  • 避免阻塞:傳統(tǒng)代碼經(jīng)常會(huì)造成阻塞--在等待緩慢的事物時(shí),,程序會(huì)處于空閑狀態(tài),。異步編程可以讓程序在此期間執(zhí)行其他任務(wù)。
  • 響應(yīng)式應(yīng)用程序:想象一下構(gòu)建一個(gè)網(wǎng)絡(luò)應(yīng)用程序,。如果一個(gè)請(qǐng)求需要很長時(shí)間,,異步技術(shù)可以防止應(yīng)用程序凍結(jié)。
  • 處理 I/O 綁定問題:網(wǎng)絡(luò)請(qǐng)求,、文件操作......都是異步處理的首選,。

使用 asyncio 的簡(jiǎn)單示例

import asyncio
import aiohttp  # Library for async web requests

async def fetch_data(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()

async def main():
    tasks = [fetch_data('https://api./data1'),
             fetch_data('https://api./data2')]
    results = await asyncio.gather(*tasks)
    # Process both results 

if __name__ == '__main__':
    asyncio.run(main())

工作原理

  • asyncio 是 Python 的內(nèi)置 async 庫。
  • async def 標(biāo)記函數(shù)為協(xié)程(一種特殊的可暫停和恢復(fù)函數(shù)),。
  • await 的神奇之處在于,,它指示 Python 暫停執(zhí)行并等待某些事件(如網(wǎng)絡(luò)請(qǐng)求)完成。
  • asyncio.gather 允許同時(shí)運(yùn)行多個(gè)程序,。

這個(gè)工作原理看起來很不錯(cuò),!asyncio 的確是一個(gè)強(qiáng)大的庫,它使得編寫異步代碼變得更加簡(jiǎn)單和高效,。同時(shí),,async defawait 的結(jié)合也讓編寫異步函數(shù)更加直觀和易懂。而asyncio.gather更是提供了方便的方式來同時(shí)運(yùn)行多個(gè)異步任務(wù),。這些工具的結(jié)合確實(shí)為編寫異步代碼提供了很多便利,。有需要的話,我可以為你提供更多關(guān)于asyncio和異步編程的信息,。

圖片

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多