中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

揚州廣陵區(qū)建設局網(wǎng)站什么叫優(yōu)化

揚州廣陵區(qū)建設局網(wǎng)站,什么叫優(yōu)化,網(wǎng)站做標簽頁,英語網(wǎng)站建設費用C#/.net程序調用python C#的優(yōu)勢在于window下的開發(fā),不僅功能強大而且開發(fā)周期短。而python則有眾多的第三方庫,可以避免自己造輪子,利用C#來做界面,而具體實現(xiàn)使用python來實現(xiàn)可以大大提高開發(fā)效率。本文介紹如何使用pythonnet…

C#/.net程序調用python

C#的優(yōu)勢在于window下的開發(fā),不僅功能強大而且開發(fā)周期短。而python則有眾多的第三方庫,可以避免自己造輪子,利用C#來做界面,而具體實現(xiàn)使用python來實現(xiàn)可以大大提高開發(fā)效率。本文介紹如何使用pythonnet來執(zhí)行python腳本,使用pythonnet既可以具有較高的交互性,又可以使用第三方python庫,同時可以將程序需要的python環(huán)境及第三方庫打包到軟件中,避免用戶進行python的環(huán)境配置。

C#調用python的常見方法

調用python常見的方法有4種

方式優(yōu)點缺點
使用IronPython無需安裝python運行環(huán)境,交互性強,C#和python無縫連接某些python第三方庫不支持,如numpy
使用C++調用Python,然后將C++程序做成動態(tài)鏈接庫交互性較強需要用戶配置Python環(huán)境,實現(xiàn)方式復雜
利用C#命令行調用py文件執(zhí)行速度快需要用戶配置Python環(huán)境,交互性差
將python文件打包成exe進行調用無需安裝python運行環(huán)境,執(zhí)行速度慢,傳遞數(shù)據(jù)復雜,交互性差

可以看出4種方式均有限制,很難同時滿足交互性強、可調用第三方python庫、無需用戶配置Python環(huán)境要求,而這幾項要求恰恰是一款成熟軟件所必須的。而使用pythonnet庫可滿足以上三點要求。

本文均在.net 6環(huán)境下測試

使用pythonnet

  1. Nuget安裝pythonnet

  2. 設置Runtime.PythonDLL屬性,即pythonxx.dll路徑,xx為版本號

  3. 設置PythonEngine.PythonHome,即python.exe所在路徑

  4. 設置PythonEngine.PythonPath,python腳本所在目錄,可以放置多個路徑,以分號隔開,但是pathToVirtualEnv\Lib\site-packages和pathToVirtualEnv\Lib應放在最后

  5. 調用PythonEngine.Initialize();

    string pathToVirtualEnv = ".\envs\\pythonnetTest";
    Runtime.PythonDLL = Path.Combine(pathToVirtualEnv, "python39.dll");
    PythonEngine.PythonHome = Path.Combine(pathToVirtualEnv, "python.exe");
    PythonEngine.PythonPath = $"{pathToVirtualEnv}\\Lib\\site-packages;{pathToVirtualEnv}\\Lib";
    PythonEngine.Initialize();
    //調用無參無返回值方法
    using (Py.GIL()) //執(zhí)行python的調用應該放在using (Py.GIL())塊內
    {//python對象應聲明為dynamic類型dynamic np = Py.Import("test");np.hello();
    }
    //調用有參有返回值方法
    using (Py.GIL())
    {dynamic np = Py.Import("test");int r = np.add(1, 2);Console.WriteLine($"計算結果{r}");
    }
    

python文件,必須放在PythonEngine.PythonPath設定的目錄下

def hello():print("hello")def add(a,b):return a+b

嵌入Python環(huán)境及使用第三方庫

程序中包含Python腳本所需要的所有環(huán)境以及第三方庫可以免去用戶的自定義配置。本文使用Anaconda來構建專用的虛擬環(huán)境。

  1. 創(chuàng)建專用虛擬環(huán)境(windows下首先切換到要建立虛擬環(huán)境的根目錄下),執(zhí)行conda create --prefix=F:\condaenv\env_name python=3.7 路徑及python版本根據(jù)需要自定義。

  2. 使用Anaconda Prompt,激活虛擬環(huán)境conda activate F:\condaenv\env_name

  3. 本次測試第三方庫Numpy(如果需要其他庫,安裝方法相同),安裝Numpypip install numpy

    string pathToVirtualEnv = ".\\envs\\pythonnetTest";
    Runtime.PythonDLL = Path.Combine(pathToVirtualEnv, "python39.dll");
    PythonEngine.PythonHome = Path.Combine(pathToVirtualEnv, "python.exe");
    PythonEngine.PythonPath = $"{pathToVirtualEnv}\\Lib\\site-packages;{pathToVirtualEnv}\\Lib";
    PythonEngine.Initialize()
    //使用第三方庫
    using (Py.GIL())
    {dynamic np = Py.Import("numpy");Console.WriteLine(np.cos(np.pi * 2));dynamic sin = np.sin;Console.WriteLine(sin(5));double c = (double)(np.cos(5) + sin(5));Console.WriteLine(c);dynamic a = np.array(new List<float> { 1, 2, 3 });Console.WriteLine(a.dtype);dynamic b = np.array(new List<float> { 6, 5, 4 }, dtype: np.int32);Console.WriteLine(b.dtype);Console.WriteLine(a * b);Console.ReadKey();
    }
    

    image-20230301123243892

    注意:C#和python對象進行數(shù)學運算時,必須將Python對象放到前面,例如np.pi*2,不能是2*np.pi

傳遞對象

可以將C#對象傳遞到python中

在C#中定義對象

public class Person
{public Person(string firstName, string lastName){FirstName = firstName;LastName = lastName;}public string FirstName { get; set; }public string LastName { get; set; }
}
string pathToVirtualEnv = ".\\envs\\pythonnetTest";
Runtime.PythonDLL = Path.Combine(pathToVirtualEnv, "python39.dll");
PythonEngine.PythonHome = Path.Combine(pathToVirtualEnv, "python.exe");
PythonEngine.PythonPath = $"{pathToVirtualEnv}\\Lib\\site-packages;{pathToVirtualEnv}\\Lib";
PythonEngine.Initialize();
//將C#中定義的類型傳入python
using (Py.GIL()) 
{Person p = new Person("John", "Smith");PyObject pyPerson = p.ToPython();string r1 = test.FullName(pyPerson);Console.WriteLine($"全名:{r1}");
}

python腳本

def FullName(p):return p.FirstName+""+p.LastName

image-20230301140858858

調用pyd文件

pyd文件主要有以下2點作用:

  1. 安全性更高:通過pyd生成的文件,已變成了dll文件,無法查看源碼
  2. 編譯成pyd后,性能會有提升

將.py文件編譯成pyd文件步驟如下:

  1. pip install cython
  2. 在.py文件目錄下創(chuàng)建setup.py文件
from distutils.core import setup
from Cython.Build import cythonizesetup(
name = "testName",
ext_modules = cythonize("test.py"), #將test.py文件編譯成pyd
)
  1. 執(zhí)行編譯命令

python setup.py build_ext --inplace

最后生成的pyd文件一般是test+cpython版本-平臺為文件名,可以重命名為test名稱,也可以不管,使用時仍然可以按test調用。

調動pyd文件和調用py文件相同,但是執(zhí)行效率大大增強,下文會對執(zhí)行速度進行對比。

執(zhí)行速度對比

在test.py中定義一個耗時函數(shù)

import timedef Count():start = time.perf_counter()sum = 0for i in range(10000):for j in range(10000):sum = sum + i + jprint("sum = ", sum)end = time.perf_counter()runTime = end - startrunTime_ms = runTime * 1000print("運行時間:", runTime, "秒")
  • 直接執(zhí)行test.py腳本,運行結果如下:

image-20230301144439558

  • 在C#中調用Conut()函數(shù)
//運行時間測試
Console.WriteLine("C#開始計時");
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
test.Count();
stopWatch.Stop();
Console.WriteLine($"C#計時結束{stopWatch.ElapsedMilliseconds}");

執(zhí)行結果如下:

image-20230301144923477

可以看到,使用pythonnet調用python腳本會有一定的性能損失,不過在對性能要求不是十分高的條件下是可以接受的。

  • 執(zhí)行test.pyd文件,運行結果如下:

image-20230301145141422

從結果可以看出調用pyd比原生的py文件執(zhí)行還要快,所以可以使用pythonnet來執(zhí)行pyd文件,即實現(xiàn)代碼保護又提升了執(zhí)行效率。

http://www.risenshineclean.com/news/52755.html

相關文章:

  • 怎么查在哪個網(wǎng)站做的備案如何進行關鍵詞優(yōu)化工作
  • 百度快快速排名南昌seo全網(wǎng)營銷
  • 唐山 網(wǎng)站建設騰訊企點下載
  • 武漢做網(wǎng)站找哪家好我想做電商
  • 千鋒python培訓seo專業(yè)培訓需要多久
  • 網(wǎng)站內容做淘寶店鋪鏈接影響排名嗎軟文營銷經典案例200字
  • wordpress 中文 相冊插件下載優(yōu)化排名 生客seo
  • 網(wǎng)站掛馬解決自動點擊器
  • 動態(tài)網(wǎng)站制作視頻教程軟件優(yōu)化
  • 網(wǎng)站建設的內容中國唯一沒有疫情的地方
  • 關方網(wǎng)站買微信騰訊朋友圈廣告怎么投放
  • 網(wǎng)站目錄架構網(wǎng)站死鏈檢測工具
  • 士兵突擊網(wǎng)站怎么做網(wǎng)絡域名
  • 二級網(wǎng)站建設比較好用的搜索引擎
  • 湖南seo網(wǎng)站設計友情鏈接如何添加
  • 珠海網(wǎng)站建設優(yōu)化推廣班級優(yōu)化大師官網(wǎng)
  • 在哪里自己建設網(wǎng)站杭州網(wǎng)站建設方案優(yōu)化
  • 網(wǎng)站測試有哪些主要工作市場營銷
  • 上海公司注冊網(wǎng)站網(wǎng)址查詢
  • 無錫市建設培訓中心網(wǎng)站百度關鍵詞排名怎么做
  • 做公眾好號的網(wǎng)站百度seo 優(yōu)化
  • 程序員除了做軟件是不是就做網(wǎng)站個人開發(fā)app去哪里接廣告
  • 備案 網(wǎng)站名稱什么用湖北權威的百度推廣
  • 怎么做黑客把網(wǎng)站余額更改企業(yè)網(wǎng)站seo推廣方案
  • 做自己的網(wǎng)站花多錢2345網(wǎng)址導航桌面版
  • 如何做網(wǎng)站插件無限制搜索引擎排名
  • 正規(guī)的合肥網(wǎng)站建設商家推廣平臺有哪些
  • 住房與城鄉(xiāng)建設部網(wǎng)站職責營銷策劃案例
  • 免費微商城平臺官網(wǎng)最優(yōu)化方法
  • 網(wǎng)站怎么做導航條新聞發(fā)布會稿件