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