去除水印需要13秒,不知道為啥很慢,有時(shí)候慢到接近30秒
一、前言
前幾天在Python白銀交流群【顧德貓寧】問了一個(gè)Python去除水印慢的問題,問題如下:
下面的代碼去除水印需要13秒,麻煩大神幫忙看看,
def delete_watermark(path):
t = time.time()
img = Image.open(path)
width, height = img.size
for pos in product(range(width), range(height)):
rgb = img.getpixel(pos)[:3]
if sum(rgb) >= 255 and sum(rgb) < 600:
img.putpixel(pos, (0, 0, 0)) # 替換水印,根據(jù)背景像素調(diào)整
elif sum(rgb) >= 600: # 檢測淺白色像素,即水印,根據(jù)水印類型調(diào)整
img.putpixel(pos, (255, 255, 255)) # 替換水印,根據(jù)背景像素調(diào)整
img = img.convert('L')
print(time.time() - t)
去除水印的原圖如下:
去除水印的時(shí)間需要13秒,偶爾會2-3秒,不知道為啥很慢,有時(shí)候慢到接近30秒。
二、實(shí)現(xiàn)過程
這里【此類生物】分享了自己的一個(gè)經(jīng)驗(yàn),倒是覺得正常,13秒不算很慢。
后來【東哥】問了AI,給出的答案如下:
這段Python代碼的目的是去除圖像中的水印。代碼執(zhí)行效率受到多種因素的影響,以下是一些可能導(dǎo)致執(zhí)行時(shí)間較長的原因:
- 圖像大小:如果圖像分辨率很高(即寬度和高度很大),則需要處理的像素點(diǎn)數(shù)量會大大增加,這將顯著增加計(jì)算時(shí)間。
- 循環(huán)遍歷:代碼中使用了一個(gè)雙層循環(huán)來遍歷圖像的每一個(gè)像素點(diǎn)。對于大型圖像,這將產(chǎn)生大量的迭代,導(dǎo)致處理時(shí)間變長。
getpixel
和putpixel
方法:這兩個(gè)方法在每次調(diào)用時(shí)都會進(jìn)行磁盤I/O操作,因?yàn)樗鼈冃枰獜奈募凶x取或?qū)懭胂袼財(cái)?shù)據(jù)。頻繁的I/O操作會顯著降低代碼的執(zhí)行效率。- 條件判斷:在每次迭代中,代碼都會進(jìn)行條件判斷來決定是否替換像素。這些判斷操作會增加額外的處理時(shí)間。
- 圖像轉(zhuǎn)換:在循環(huán)結(jié)束后,圖像被轉(zhuǎn)換成灰度圖(
img.convert('L')
)。這個(gè)操作也需要時(shí)間,尤其是對于大型圖像。 - 硬件性能:執(zhí)行時(shí)間還受到計(jì)算機(jī)硬件性能的影響,包括CPU速度、內(nèi)存大小和硬盤性能等。
- 系統(tǒng)負(fù)載:如果系統(tǒng)在運(yùn)行此腳本時(shí)還有其他高負(fù)載任務(wù),也可能導(dǎo)致處理速度變慢。
為了提高代碼的執(zhí)行效率,可以考慮以下優(yōu)化措施:
- 使用更高效的圖像處理庫,如Pillow的內(nèi)部優(yōu)化可能比基本的PIL庫更好。
- 減少不必要的條件判斷,或者預(yù)先計(jì)算好判斷條件。
- 避免在循環(huán)中進(jìn)行頻繁的I/O操作,可以考慮先將圖像數(shù)據(jù)加載到內(nèi)存中,然后進(jìn)行處理。
- 對于大型圖像,可以考慮使用多線程或多進(jìn)程來并行處理不同部分的像素。
- 如果可能,使用更快速的存儲設(shè)備,如SSD而不是HDD。
請注意,去除水印可能涉及版權(quán)和法律問題。在使用此類代碼時(shí),請確保遵守相關(guān)法律法規(guī),并尊重原創(chuàng)內(nèi)容的版權(quán)。
看上去這個(gè)原因還是很多的,如果能夠跑起來的話,建議如果是自己用的話,還是不要先去追求性能了,如果是公司需要,可以跟老板提需求,換個(gè)好一些的電腦。
順利地解決了粉絲的問題。
如果你也有類似這種Python相關(guān)的小問題,歡迎隨時(shí)來交流群學(xué)習(xí)交流哦,有問必答!
三、總結(jié)
大家好,我是Python進(jìn)階者。這篇文章主要盤點(diǎn)了一個(gè)Python去除水印慢的問題,文中針對該問題,給出了具體的解析和代碼實(shí)現(xiàn),幫助粉絲順利解決了問題。