国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

在python中通過調(diào)用dll來提高運(yùn)行速度

這篇具有很好參考價(jià)值的文章主要介紹了在python中通過調(diào)用dll來提高運(yùn)行速度。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1、前言

最近項(xiàng)目中需要錄制鍵鼠命令,然后再通過注入的方式回放錄制過程。一般來說,普通的一些點(diǎn)擊命令完全可以通過python的一些包來完成鍵鼠模擬操作,比如通過pyautogui包。但是,鼠標(biāo)移動過程中,如果采用頻率很高的話,比如1s之類采樣50個點(diǎn)像素坐標(biāo),那么就會發(fā)現(xiàn),如果是通過python進(jìn)行回放的話,整個回放過程,相比于原來的錄制過程,就如同慢放一樣。
整個過程抽象如下:
在錄制過程每隔時間T進(jìn)行一次采樣(記錄下該點(diǎn)的坐標(biāo)),由于采樣本身所消耗的時間極少(小于0.1ms),可以忽略,因此,錄制過程假如采樣n個點(diǎn),需要的時間為:nT
回放過程,需要依次移動到采樣的的每個點(diǎn)p1、p2…,由于在回放過程移動到每個點(diǎn)是通過python函數(shù)moveTo來實(shí)現(xiàn)的,而函數(shù)moveTo執(zhí)行一次的時間為t(大概在100ms左右,不能忽略),所以回放過程消耗的時間為:nT + nt 。
回放過程與錄制過程的時間比比:(nT + nt)/nT = 1 + t/T,因此回放過程相對于錄制過程,相當(dāng)于是1 + t/T倍慢放。并且采樣頻率越高,即T越小,慢放的比例越大!
在python中通過調(diào)用dll來提高運(yùn)行速度,C++基礎(chǔ)知識,python與爬蟲,python,c++,python與c++性能對比,python中調(diào)用dll,python與動態(tài)庫
為了讓回放過程更加接近錄制過程,即減小慢放的比例,就需要縮放moveTo的執(zhí)行時間。由于通過python實(shí)現(xiàn)moveTo的時間消耗較長,可以通過c/c++來實(shí)現(xiàn)moveTo,就可以大幅縮短moveTo需要的時間。

2、生成dll

為了在python中調(diào)用dll,需要先生成moveTo的dll文件。對應(yīng)的源碼如下:

// mouseMove.h
#ifdef MYDLL_EXPORTS
#define MATH_API __declspec(dllexport)
#else
#define MATH_API __declspec(dllimport)
#endif
#include <windows.h>
extern "C" {
	MATH_API void mouseClick(int x, int y);
	MATH_API void LeftDown(int x, int y);
	MATH_API void LeftUp(int x, int y);
	MATH_API void mouseMove(int x, int y);  // 對應(yīng)moveTo函數(shù)
}
// mouseMove.cpp
void mouseClick(int x, int y) {
	INPUT input = { 0 };
	input.type = INPUT_MOUSE;
	input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP;

	// 計(jì)算屏幕上的坐標(biāo)位置
	input.mi.dx = x * 65535 / GetSystemMetrics(SM_CXSCREEN);
	input.mi.dy = y * 65535 / GetSystemMetrics(SM_CYSCREEN);

	SendInput(1, &input, sizeof(INPUT));
}

void LeftDown(int x, int y) {
	INPUT input = { 0 };
	input.type = INPUT_MOUSE;
	input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_LEFTDOWN;

	// 計(jì)算屏幕上的坐標(biāo)位置
	input.mi.dx = x * 65535 / GetSystemMetrics(SM_CXSCREEN);
	input.mi.dy = y * 65535 / GetSystemMetrics(SM_CYSCREEN);

	SendInput(1, &input, sizeof(INPUT));
}
void LeftUp(int x, int y) {
	INPUT input = { 0 };
	input.type = INPUT_MOUSE;
	input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_LEFTUP;

	// 計(jì)算屏幕上的坐標(biāo)位置
	input.mi.dx = x * 65535 / GetSystemMetrics(SM_CXSCREEN);
	input.mi.dy = y * 65535 / GetSystemMetrics(SM_CYSCREEN);

	SendInput(1, &input, sizeof(INPUT));
}
void mouseMove(int x, int y) {
	INPUT input = { 0 };
	input.type = INPUT_MOUSE;
	input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;

	// 計(jì)算屏幕上的坐標(biāo)位置
	input.mi.dx = x * 65535 / GetSystemMetrics(SM_CXSCREEN);
	input.mi.dy = y * 65535 / GetSystemMetrics(SM_CYSCREEN);

	SendInput(1, &input, sizeof(INPUT));
}

注意:在dll文件中不僅實(shí)現(xiàn)mouseMove(對應(yīng)moveTo),還順帶實(shí)現(xiàn)了mouseClick等操作。

3、通過pyton調(diào)用dll

在python中調(diào)用dll文件,只需要先導(dǎo)入ctypes包,然后通過ctypes包加載dll文件,然后調(diào)用dll中的函數(shù)即可。

import ctypes
import pyautogui
# 加載dll文件
lib = ctypes.cdll.LoadLibrary("E:\\program\\cplusplus\\myDll\\x64\\Release\\myDll.dll")
# 調(diào)用dll中的函數(shù)
lib.mouseMove(100,200)

4、python庫與dll庫運(yùn)行速度對比

都知道比速度python肯定是比不上c/c++,但是運(yùn)行速度到底差了多少呢?如果單純是就論本問題提到的移動鼠標(biāo)這個功能的話,說出來可能嚇人?。?!
無圖說個。。。。,

import time
import ctypes
import pyautogui
lib = ctypes.cdll.LoadLibrary("E:\\program\\cplusplus\\myDll\\x64\\Release\\myDll.dll")
t = time.time()
# dll執(zhí)行1000次mouseMove
for i in range(0,1000):
    lib.mouseMove(i,2)
t1 = time.time()
print("mouseMove 1000 times by dll: ",t1 - t)
# 通過pyautogui執(zhí)行100次moveTo
t = time.time()
for i in range(0,100):
    pyautogui.moveTo(i,300)
t1 = time.time()
print("moveTo 100 times by pyautogui:",t1 - t)

在python中通過調(diào)用dll來提高運(yùn)行速度,C++基礎(chǔ)知識,python與爬蟲,python,c++,python與c++性能對比,python中調(diào)用dll,python與動態(tài)庫
從圖中可以看到,通過dll執(zhí)行1000次mouseMove消耗的時間為0.11s,平均一次0.1ms左右
通過pyautogui執(zhí)行100 mouseTo消耗時間為10s,平均一次消耗時間100ms
居然相差了1000倍???
難怪錄制過程轉(zhuǎn)換為python回放都變慢放了~
------------------------- 更新 ------------------------------------
之前一直很難相信python和c++ dll的速度會相差這么,事實(shí)上卻是也沒有這么大的差距,應(yīng)該本質(zhì)上pyautogui也是通過調(diào)用windows API相關(guān)dll。那么問題出在哪里呢?
研究pyautogui源碼發(fā)現(xiàn),pyautogui的moveTo接口有裝飾器,絕大部分時間都消耗在了裝飾器上。
在python中通過調(diào)用dll來提高運(yùn)行速度,C++基礎(chǔ)知識,python與爬蟲,python,c++,python與c++性能對比,python中調(diào)用dll,python與動態(tài)庫
將裝飾器去掉的話,就和調(diào)用dll的速度相當(dāng)了。

參考文章:
【1】python 調(diào)用 c++ dll庫
【2】C++模擬鼠標(biāo)移動及單擊實(shí)現(xiàn)代碼
【3】[python] python調(diào)用C++ 程序文章來源地址http://www.zghlxwxcb.cn/news/detail-660878.html

到了這里,關(guān)于在python中通過調(diào)用dll來提高運(yùn)行速度的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • (親測可行)關(guān)于提高IDEA運(yùn)行速度的方案

    (親測可行)關(guān)于提高IDEA運(yùn)行速度的方案

    如果idea版本和本文不符,請不要輕易嘗試,造成代碼丟失,自行負(fù)責(zé)。 版本: Ultimate 2022.1.2版IDEA,計(jì)算機(jī)內(nèi)存為12GB 打開idea,找到左上角的”help“標(biāo)簽,對話框中選擇Edit Custom FVM Options… 調(diào)節(jié)(最小和最大)堆內(nèi)存(看本機(jī)內(nèi)存來頂,不超過20%):-Xms和-Xmx 調(diào)節(jié)代碼緩存

    2024年01月17日
    瀏覽(20)
  • Selenium | 你真的知道怎么提高Selenium的運(yùn)行速度嗎?

    Selenium | 你真的知道怎么提高Selenium的運(yùn)行速度嗎?

    對于網(wǎng)上流傳的提高selenium的方法有很多,但從程序運(yùn)行的感官上來看,感覺提速并不明顯。所以,我特地做了一些測試,尋找最優(yōu)方案。 但是,由于對不同組的測試次數(shù)并不相同,結(jié)果可能不太嚴(yán)謹(jǐn)。但是,一般來說,結(jié)果基本都在一定范圍內(nèi)浮動,所以結(jié)果和多次測試大

    2024年02月03日
    瀏覽(18)
  • [Selenium]你真的知道怎么提高Selenium的運(yùn)行速度嗎?

    [Selenium]你真的知道怎么提高Selenium的運(yùn)行速度嗎?

    對于網(wǎng)上流傳的提高selenium的方法有很多,但從程序運(yùn)行的感官上來看,感覺提速并不明顯。所以,我特地做了一些測試,尋找最優(yōu)方案。 但是,由于對不同組的測試次數(shù)并不相同,結(jié)果可能不太嚴(yán)謹(jǐn)。但是,一般來說,結(jié)果基本都在一定范圍內(nèi)浮動,所以結(jié)果和多次測試大

    2024年02月06日
    瀏覽(20)
  • MySQL數(shù)據(jù)庫——MySQL優(yōu)化服務(wù)器,提高M(jìn)ySQL的運(yùn)行速度!

    MySQL是一種廣泛使用的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),優(yōu)化MySQL服務(wù)器可以顯著提高數(shù)據(jù)庫的性能和運(yùn)行速度。在下面的回答中,我將介紹一些常見的MySQL優(yōu)化策略和技術(shù),以幫助提高M(jìn)ySQL服務(wù)器的性能。 1、優(yōu)化數(shù)據(jù)庫設(shè)計(jì): 正確設(shè)計(jì)數(shù)據(jù)庫結(jié)構(gòu),使用適當(dāng)?shù)臄?shù)據(jù)類型、索引和約束

    2024年02月07日
    瀏覽(37)
  • 三行Python代碼,讓數(shù)據(jù)處理速度提高2到6倍

    三行Python代碼,讓數(shù)據(jù)處理速度提高2到6倍

    Python 是機(jī)器學(xué)習(xí)領(lǐng)域內(nèi)的首選編程語言,它易于使用,也有很多出色的庫來幫助你更快處理數(shù)據(jù)。但當(dāng)我們面臨大量數(shù)據(jù)時,一些問題就會顯現(xiàn) …… 在默認(rèn)情況下, Python 程序是單個進(jìn)程,使用單 CPU 核心執(zhí)行。而大多數(shù)當(dāng)代機(jī)器學(xué)習(xí)硬件都至少搭載了雙核處理器。這意味著

    2023年04月18日
    瀏覽(16)
  • Python多線程爬蟲為何效率低下?解析原因并提高爬蟲速度的方法

    線程(Thread)也叫輕量級進(jìn)程,是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位,它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。線程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源,但它可與同屬的一個進(jìn)程的其它線程共享進(jìn)程所擁有的全部資源。一個線程可以創(chuàng)建

    2024年02月01日
    瀏覽(19)
  • python 調(diào)用dll 詳解

    準(zhǔn)備 將動態(tài)庫與py文件放在同一目錄下 引入ctypes庫 加載動態(tài)庫 數(shù)據(jù)類型 ctypes數(shù)據(jù)類型 C數(shù)據(jù)類型 c_char char c_short short c_int int c_long long c_ulong unsigned long c_float float c_double double c_char_p char* c_void_p void* 基本數(shù)據(jù)類型參數(shù) argtypes :定義函數(shù)的參數(shù)類型 restype :定義函數(shù)的返回值類

    2024年02月14日
    瀏覽(23)
  • Python調(diào)用動態(tài)鏈接庫(DLL)

    Python調(diào)用動態(tài)鏈接庫(DLL) 動態(tài)鏈接庫(Dynamic Link Libraries,簡稱DLL)是一種被多個程序共享的庫文件,可以被用于將程序分解為小模塊,減少內(nèi)存占用,加快程序運(yùn)行速度。而Python作為一種高級編程語言,可以方便地調(diào)用外部的DLL文件。 在Python中,可以使用ctypes模塊來調(diào)用

    2024年02月13日
    瀏覽(20)
  • visual studio編寫DLL,python調(diào)用

    visual studio編寫DLL,python調(diào)用

    選擇第一個c++ DLL, 然后項(xiàng)目源文件下右擊新建項(xiàng),這里名字隨便取,在代碼中輸入一下內(nèi)容: 在visual studio的項(xiàng)目右擊屬性 選擇不使用編譯頭,然后點(diǎn)擊點(diǎn)擊生成解決方案 就可以生成DLL文件了 (PS:前面截圖代碼忘記添加EXPORT,請參考代碼框的代碼) 然后python調(diào)用即可 如果

    2024年02月09日
    瀏覽(22)
  • Python如何調(diào)用DLL庫?——實(shí)例詳解及代碼

    Python如何調(diào)用DLL庫?——實(shí)例詳解及代碼 在Python中,您可以通過調(diào)用DLL庫完成各種功能,來滿足不同的需求。調(diào)用DLL庫意味著從外部獲取了一些函數(shù),可以在Python中直接調(diào)用這些函數(shù),這對于Python程序員來說是一種非常有用的技能。本文將為大家介紹如何在Python中調(diào)用DLL庫。

    2024年02月06日
    瀏覽(46)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包