日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

當(dāng)創(chuàng)建一個(gè) Python 對(duì)象時(shí),背后都經(jīng)歷了哪些過程?

來源: 責(zé)編: 時(shí)間:2024-05-21 17:30:25 134觀看
導(dǎo)讀楔子本篇文章來聊一聊對(duì)象的創(chuàng)建,一個(gè)對(duì)象是如何從無到有產(chǎn)生的呢?>>> n = 123>>> n123比如在終端中執(zhí)行 n = 123,一個(gè)整數(shù)對(duì)象就被創(chuàng)建好了,但它的背后都發(fā)生了什么呢?帶著這些疑問,開始今天的內(nèi)容。Python 為什么這么慢前

楔子

SYN28資訊網(wǎng)——每日最新資訊28at.com

SYN28資訊網(wǎng)——每日最新資訊28at.com

本篇文章來聊一聊對(duì)象的創(chuàng)建,一個(gè)對(duì)象是如何從無到有產(chǎn)生的呢?SYN28資訊網(wǎng)——每日最新資訊28at.com

>>> n = 123>>> n123

比如在終端中執(zhí)行 n = 123,一個(gè)整數(shù)對(duì)象就被創(chuàng)建好了,但它的背后都發(fā)生了什么呢?帶著這些疑問,開始今天的內(nèi)容。SYN28資訊網(wǎng)——每日最新資訊28at.com

SYN28資訊網(wǎng)——每日最新資訊28at.com

Python 為什么這么慢

SYN28資訊網(wǎng)——每日最新資訊28at.com

SYN28資訊網(wǎng)——每日最新資訊28at.com

前面我們介紹了 Python 對(duì)象在底層的數(shù)據(jù)結(jié)構(gòu),知道了 Python 底層是通過 PyObject 實(shí)現(xiàn)了對(duì)象的多態(tài)。所以我們先來分析一下 Python 為什么慢?SYN28資訊網(wǎng)——每日最新資訊28at.com

在 Python 中創(chuàng)建一個(gè)對(duì)象,會(huì)分配內(nèi)存并進(jìn)行初始化,然后用一個(gè) PyObject * 指針來維護(hù)這個(gè)對(duì)象,當(dāng)然所有對(duì)象都是如此。因?yàn)橹羔樖强梢韵嗷マD(zhuǎn)化的,所以變量在保存一個(gè)對(duì)象的指針時(shí),會(huì)將指針轉(zhuǎn)成 PyObject * 之后再交給變量保存。SYN28資訊網(wǎng)——每日最新資訊28at.com

因此在 Python 中,變量的傳遞(包括函數(shù)的參數(shù)傳遞)實(shí)際上傳遞的都是泛型指針 PyObject *。這個(gè)指針具體指向什么類型的對(duì)象我們并不知道,只能通過其內(nèi)部的 ob_type 字段進(jìn)行動(dòng)態(tài)判斷,而正是因?yàn)檫@個(gè) ob_type,Python 實(shí)現(xiàn)了多態(tài)機(jī)制。SYN28資訊網(wǎng)——每日最新資訊28at.com

比如 a.pop(),我們不知道 a 指向的對(duì)象到底是什么類型,它可能是列表、也可能是字典,或者是我們實(shí)現(xiàn)了 pop 方法的自定義類的實(shí)例對(duì)象。至于它到底是什么類型,只能通過 ob_type 動(dòng)態(tài)判斷。SYN28資訊網(wǎng)——每日最新資訊28at.com

如果 a 的 ob_type 為 &PyList_Type,那么 a 指向的對(duì)象就是列表,于是會(huì)調(diào)用 list 類型中定義的 pop 操作。如果 a 的 ob_type 為 &PyDict_Type,那么 a 指向的對(duì)象就是字典,于是會(huì)調(diào)用 dict 類型中定義的 pop 操作。所以變量 a 在不同的情況下,會(huì)表現(xiàn)出不同的行為,這正是 Python 多態(tài)的核心所在。SYN28資訊網(wǎng)——每日最新資訊28at.com

再比如列表,它內(nèi)部的元素也都是 PyObject *,因?yàn)轭愋鸵3忠恢拢詫?duì)象的指針不能直接存(因?yàn)轭愋筒煌切枰y(tǒng)一轉(zhuǎn)成泛型指針 PyObject * 之后才可以存儲(chǔ)。當(dāng)我們通過索引獲取到該指針進(jìn)行操作的時(shí)候,也會(huì)先通過 ob_type 判斷它的類型,看它是否支持指定的操作。所以操作容器內(nèi)的某個(gè)元素,和操作一個(gè)變量并無本質(zhì)上的區(qū)別,它們都是 PyObject *。SYN28資訊網(wǎng)——每日最新資訊28at.com

從這里我們也能看出來 Python 為什么慢了,因?yàn)橛邢喈?dāng)一部分時(shí)間浪費(fèi)在類型和屬性的查找上面。SYN28資訊網(wǎng)——每日最新資訊28at.com

以變量 a + b 為例,這個(gè) a 和 b 指向的對(duì)象可以是整數(shù)、浮點(diǎn)數(shù)、字符串、列表、元組、甚至是我們自己實(shí)現(xiàn)了 __add__ 方法的類的實(shí)例對(duì)象。因?yàn)?Python 的變量都是 PyObject *,所以它可以指向任意的對(duì)象,因此 Python 就無法做基于類型的優(yōu)化。SYN28資訊網(wǎng)——每日最新資訊28at.com

SYN28資訊網(wǎng)——每日最新資訊28at.com

首先 Python 底層要通過 ob_type 判斷變量指向的對(duì)象到底是什么類型,這在 C 的層面至少需要一次屬性查找。然后 Python 將每一個(gè)算術(shù)操作都抽象成了一個(gè)魔法方法,所以實(shí)例相加時(shí)要在類型對(duì)象中找到該方法對(duì)應(yīng)的函數(shù)指針,這又是一次屬性查找。找到了之后將 a、b 作為參數(shù)傳遞進(jìn)去,這會(huì)產(chǎn)生一次函數(shù)調(diào)用,會(huì)將對(duì)象維護(hù)的值拿出來進(jìn)行運(yùn)算,然后根據(jù)相加的結(jié)果創(chuàng)建一個(gè)新的對(duì)象,再將對(duì)象的指針轉(zhuǎn)成 PyObject * 之后返回。SYN28資訊網(wǎng)——每日最新資訊28at.com

所以一個(gè)簡單的加法運(yùn)算,Python 內(nèi)部居然做了這么多的工作,要是再放到循環(huán)里面,那么上面的步驟要重復(fù) N 次。而對(duì)于 C 來講,由于已經(jīng)規(guī)定好了類型,所以 a + b 在編譯之后就是一條簡單的機(jī)器指令,因此兩者在效率上差別很大。SYN28資訊網(wǎng)——每日最新資訊28at.com

SYN28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)然我們不是來吐槽 Python 效率的問題,因?yàn)槿魏握Z言都有擅長的一面和不擅長的一面,這里只是通過回顧前面的知識(shí)來解釋為什么 Python 效率低。因此當(dāng)別人問你 Python 為什么效率低的時(shí)候,希望你能從這個(gè)角度來回答它,主要就兩點(diǎn):SYN28資訊網(wǎng)——每日最新資訊28at.com

SYN28資訊網(wǎng)——每日最新資訊28at.com

  • Python 無法基于類型做優(yōu)化;
  • Python 對(duì)象基本都存儲(chǔ)在堆上;

建議不要一上來就談 GIL,那是在多線程情況下才需要考慮的問題。而且我相信大部分覺得 Python 慢的人,都不是因?yàn)?Python 無法利用多核才覺得慢的。SYN28資訊網(wǎng)——每日最新資訊28at.com

SYN28資訊網(wǎng)——每日最新資訊28at.com

Python 的 C API

SYN28資訊網(wǎng)——每日最新資訊28at.com

SYN28資訊網(wǎng)——每日最新資訊28at.com

然后來說一說 Python 的 C API,這個(gè)非常關(guān)鍵。首先 Python 解釋器聽起來很高大上,但按照陳儒老師的說法,它不過就是用 C 語言寫出的一個(gè)開源軟件,從形式上和其它軟件并沒有本質(zhì)上的不同。SYN28資訊網(wǎng)——每日最新資訊28at.com

比如你在 Windows 系統(tǒng)中打開 Python 的安裝目錄,會(huì)發(fā)現(xiàn)里面有一個(gè)二進(jìn)制文件 python.exe 和一個(gè)動(dòng)態(tài)庫文件 python312.dll。二進(jìn)制文件負(fù)責(zé)執(zhí)行,動(dòng)態(tài)庫文件則包含了相應(yīng)的依賴,當(dāng)然編譯的時(shí)候也可以把動(dòng)態(tài)庫里的內(nèi)容統(tǒng)一打包到二進(jìn)制文件中,不過大部分軟件在開發(fā)時(shí)都會(huì)選擇前者。SYN28資訊網(wǎng)——每日最新資訊28at.com

既然解釋器是用 C 寫的,那么在執(zhí)行時(shí)肯定會(huì)將 Python 代碼翻譯成 C 代碼,這是毫無疑問的。比如創(chuàng)建一個(gè)列表,底層就會(huì)創(chuàng)建一個(gè) PyListObject 實(shí)例,比如調(diào)用某個(gè)內(nèi)置函數(shù),底層會(huì)調(diào)用對(duì)應(yīng)的 C 函數(shù)。SYN28資訊網(wǎng)——每日最新資訊28at.com

所以如果你想搞懂 Python 代碼的執(zhí)行邏輯或者編寫 Python 擴(kuò)展,那么就必須要清楚解釋器提供的 API 函數(shù)。而按照通用性來劃分的話,這些 API 可以分為兩種。SYN28資訊網(wǎng)——每日最新資訊28at.com

  • 泛型 API;
  • 特定類型 API;

泛型 API

顧名思義,泛型 API 和參數(shù)類型無關(guān),屬于抽象對(duì)象層。這類 API 的第一個(gè)參數(shù)是 PyObject *,可以處理任意類型的對(duì)象,API 內(nèi)部會(huì)根據(jù)對(duì)象的類型進(jìn)行區(qū)別處理。SYN28資訊網(wǎng)——每日最新資訊28at.com

而且泛型 API 的名稱也是有規(guī)律的,具有 PyObject_### 這種形式,我們舉例說明。SYN28資訊網(wǎng)——每日最新資訊28at.com

SYN28資訊網(wǎng)——每日最新資訊28at.com

SYN28資訊網(wǎng)——每日最新資訊28at.com

對(duì)象是如何創(chuàng)建的

SYN28資訊網(wǎng)——每日最新資訊28at.com

SYN28資訊網(wǎng)——每日最新資訊28at.com

創(chuàng)建對(duì)象可以使用泛型 API,也可以使用特定類型 API,比如創(chuàng)建一個(gè)浮點(diǎn)數(shù)。SYN28資訊網(wǎng)——每日最新資訊28at.com

使用泛型 API 創(chuàng)建

PyObject* pi = PyObject_New(PyObject, &PyFloat_Type);

通過泛型 API 可以創(chuàng)建任意類型的對(duì)象,因?yàn)樵擃?API 和類型無關(guān)。那么問題來了,解釋器怎么知道要給對(duì)象分配多大的內(nèi)存呢?SYN28資訊網(wǎng)——每日最新資訊28at.com

在介紹類型對(duì)象的時(shí)候我們提到,對(duì)象的內(nèi)存大小、支持哪些操作等等,都屬于元信息,而元信息會(huì)存在對(duì)應(yīng)的類型對(duì)象中。其中 tp_basicsize 和 tp_itemsize 負(fù)責(zé)指定實(shí)例對(duì)象所需的內(nèi)存空間。SYN28資訊網(wǎng)——每日最新資訊28at.com

// Include/objimpl.h#define PyObject_New(type, typeobj)  ((type *)_PyObject_New(typeobj))        // Objects/object.cPyObject *_PyObject_New(PyTypeObject *tp){    // 通過 PyObject_Malloc 為對(duì)象申請(qǐng)內(nèi)存,申請(qǐng)多大呢?    // 會(huì)通過 _PyObject_SIZE(tp) 進(jìn)行計(jì)算    PyObject *op = (PyObject *) PyObject_Malloc(_PyObject_SIZE(tp));    if (op == NULL) {        return PyErr_NoMemory();    }    // 設(shè)置對(duì)象的類型和引用計(jì)數(shù)    _PyObject_Init(op, tp);    return op;}// Include/cpython/objimpl.hstatic inline size_t _PyObject_SIZE(PyTypeObject *type) {    // 返回類型對(duì)象的 tp_basicsize    return _Py_STATIC_CAST(size_t, type->tp_basicsize);}

泛型 API 屬于通用邏輯,而內(nèi)置類型的實(shí)例對(duì)象一般會(huì)采用特定類型 API 創(chuàng)建。SYN28資訊網(wǎng)——每日最新資訊28at.com

使用特定類型 API 創(chuàng)建

// 創(chuàng)建浮點(diǎn)數(shù),值為 2.71PyObject* e = PyFloat_FromDouble(2.71);// 創(chuàng)建一個(gè)可以容納 5 個(gè)元素的元組PyObject* tpl = PyTuple_New(5);// 創(chuàng)建一個(gè)可以容納 5 個(gè)元素的列表// 當(dāng)然這是初始容量,列表是可以擴(kuò)容的PyObject* lst = PyList_New(5);

和泛型 API 不同,使用特定類型 API 只能創(chuàng)建指定類型的對(duì)象,因?yàn)樵擃?API 是和類型綁定的。比如我們可以用 PyDict_New 創(chuàng)建一個(gè)字典,但不可能創(chuàng)建一個(gè)集合出來。SYN28資訊網(wǎng)——每日最新資訊28at.com

如果使用特定類型 API,那么可以直接分配內(nèi)存。因?yàn)閮?nèi)置類型的實(shí)例對(duì)象,它們的定義在底層都是寫死的,解釋器對(duì)它們了如指掌,因此可以直接分配內(nèi)存并初始化。SYN28資訊網(wǎng)——每日最新資訊28at.com

比如通過 e = 2.71 創(chuàng)建一個(gè)浮點(diǎn)數(shù),解釋器看到 2.71 就知道要?jiǎng)?chuàng)建 PyFloatObject 結(jié)構(gòu)體實(shí)例,那么申請(qǐng)多大內(nèi)存呢?顯然是 sizeof(PyFloatObject),直接計(jì)算一下結(jié)構(gòu)體實(shí)例的大小即可。SYN28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片SYN28資訊網(wǎng)——每日最新資訊28at.com

顯然一個(gè) PyFloatObject 實(shí)例的大小是 24 字節(jié),所以內(nèi)存直接就分配了。分配之后將 ob_refcnt 初始化為 1、ob_type 設(shè)置為 &PyFloat_Type、ob_fval 設(shè)置為 2.71 即可。SYN28資訊網(wǎng)——每日最新資訊28at.com

同理可變對(duì)象也是一樣,因?yàn)樽侄味际枪潭ǖ模瑑?nèi)部容納的元素有多少個(gè)也可以根據(jù)賦的值得到,所以內(nèi)部的所有字段占用了多少內(nèi)存可以算出來,因此也是可以直接分配內(nèi)存的。SYN28資訊網(wǎng)——每日最新資訊28at.com

還是那句話,解釋器對(duì)內(nèi)置的數(shù)據(jù)結(jié)構(gòu)了如指掌,因?yàn)檫@些結(jié)構(gòu)在底層都是定義好的,源碼直接寫死了。所以解釋器根本不需要借助類型對(duì)象去創(chuàng)建實(shí)例對(duì)象,它只需要在實(shí)例對(duì)象創(chuàng)建完畢之后,將 ob_type 設(shè)置為指定的類型即可(讓實(shí)例對(duì)象和類型對(duì)象建立聯(lián)系)。SYN28資訊網(wǎng)——每日最新資訊28at.com

所以采用特定類型 API 創(chuàng)建實(shí)例的速度會(huì)更快,但這只適用于內(nèi)置的數(shù)據(jù)結(jié)構(gòu),而我們自定義類的實(shí)例對(duì)象顯然沒有這個(gè)待遇。假設(shè)通過 class Person: 定義了一個(gè)類,那么在實(shí)例化的時(shí)候,顯然不可能通過 PyPerson_New 去創(chuàng)建,因?yàn)榈讓訅焊蜎]有這個(gè) API。SYN28資訊網(wǎng)——每日最新資訊28at.com

這種情況下創(chuàng)建 Person 的實(shí)例對(duì)象就需要 Person 這個(gè)類型對(duì)象了,因此自定義類的實(shí)例對(duì)象如何分配內(nèi)存、如何進(jìn)行初始化,需要借助對(duì)應(yīng)的類型對(duì)象。SYN28資訊網(wǎng)——每日最新資訊28at.com

總的來說,Python 內(nèi)部創(chuàng)建一個(gè)對(duì)象有兩種方式:SYN28資訊網(wǎng)——每日最新資訊28at.com

  • 通過特定類型 API,用于內(nèi)置數(shù)據(jù)結(jié)構(gòu),即內(nèi)置類型的實(shí)例對(duì)象。
  • 通過調(diào)用類型對(duì)象去創(chuàng)建(底層會(huì)調(diào)用泛型 API),多用于自定義類型。

SYN28資訊網(wǎng)——每日最新資訊28at.com

[] 和 list(),應(yīng)該使用哪種方式

SYN28資訊網(wǎng)——每日最新資訊28at.com

SYN28資訊網(wǎng)——每日最新資訊28at.com

lst = [] 和 lst = list() 都負(fù)責(zé)創(chuàng)建一個(gè)空列表,但這兩種方式有什么區(qū)別呢?SYN28資訊網(wǎng)——每日最新資訊28at.com

我們說創(chuàng)建實(shí)例對(duì)象可以通過解釋器提供的特定類型 API,用于內(nèi)置類型;也可以通過實(shí)例化類型對(duì)象去創(chuàng)建,既可用于自定義類型,也可用于內(nèi)置類型。SYN28資訊網(wǎng)——每日最新資訊28at.com

# 通過特定類型 API 創(chuàng)建>>> lst = [] >>> lst[]# 通過調(diào)用類型對(duì)象創(chuàng)建>>> lst = list()  >>> lst[]

還是那句話,解釋器對(duì)內(nèi)置數(shù)據(jù)結(jié)構(gòu)了如指掌,并且做足了優(yōu)化。SYN28資訊網(wǎng)——每日最新資訊28at.com

  • 看到 123,就知道創(chuàng)建 PyLongObject 實(shí)例;
  • 看到 2.71,就知道創(chuàng)建 PyFloatObject 實(shí)例;
  • 看到 ( ),就知道創(chuàng)建 PyTupleObject 實(shí)例;
  • 看到 [ ],就知道創(chuàng)建 PyListObject 實(shí)例;
  • ······

這些都會(huì)使用特定類型 API 去創(chuàng)建,直接為結(jié)構(gòu)體申請(qǐng)內(nèi)存,然后設(shè)置引用計(jì)數(shù)和類型,所以使用 [ ] 創(chuàng)建列表是最快的。SYN28資訊網(wǎng)——每日最新資訊28at.com

但如果使用 list() 創(chuàng)建列表,那么就產(chǎn)生了一個(gè)調(diào)用,要進(jìn)行參數(shù)解析、類型檢測、創(chuàng)建棧幀、銷毀棧幀等等,所以開銷會(huì)大一些。SYN28資訊網(wǎng)——每日最新資訊28at.com

import timestart = time.perf_counter()for _ in range(10000000):    lst = []end = time.perf_counter()print(end - start) """0.2144167000001289"""start = time.perf_counter()for _ in range(10000000):    lst = list()end = time.perf_counter()print(end - start) """0.4079916000000594"""

通過 [ ] 的方式創(chuàng)建一千萬次空列表需要 0.21 秒,但通過 list() 的方式創(chuàng)建一千萬次空列表需要 0.40 秒,主要就在于 list() 是一個(gè)調(diào)用,而 [ ] 直接會(huì)被解析成 PyListObject,因此 [ ] 的速度會(huì)更快一些。SYN28資訊網(wǎng)——每日最新資訊28at.com

所以對(duì)于內(nèi)置類型的實(shí)例對(duì)象而言,使用特定類型 API 創(chuàng)建要更快一些。而且事實(shí)上通過類型對(duì)象去創(chuàng)建的話,會(huì)先調(diào)用 tp_new,然后在 tp_new 內(nèi)部還是調(diào)用了特定類型 API。SYN28資訊網(wǎng)——每日最新資訊28at.com

比如:SYN28資訊網(wǎng)——每日最新資訊28at.com

  • 創(chuàng)建列表:可以是 list()、也可以是 [ ];
  • 創(chuàng)建元組:可以是 tuple()、也可以是 ( );
  • 創(chuàng)建字典:可以是 dict()、也可以是 { };

前者是通過類型對(duì)象去創(chuàng)建的,后者是通過特定類型 API 創(chuàng)建。但對(duì)于內(nèi)置類型而言,我們推薦使用特定類型 API 創(chuàng)建,會(huì)直接解析為對(duì)應(yīng)的 C 一級(jí)數(shù)據(jù)結(jié)構(gòu),因?yàn)檫@些結(jié)構(gòu)在底層都是已經(jīng)實(shí)現(xiàn)好了的,可以直接用。而無需通過諸如 list() 這種調(diào)用類型對(duì)象的方式來創(chuàng)建,因?yàn)樗鼈儍?nèi)部最終還是使用了 特定類型 API,相當(dāng)于多繞了一圈。SYN28資訊網(wǎng)——每日最新資訊28at.com

不過以上都是內(nèi)置類型,而自定義的類型就沒有這個(gè)待遇了,它的實(shí)例對(duì)象只能通過它自己創(chuàng)建。比如 Person 這個(gè)類,解釋器不可能事先定義一個(gè) PyPersonObject 然后將 API 提供給我們,所以我們只能通過 Person() 這種調(diào)用類型對(duì)象的方式來創(chuàng)建它的實(shí)例對(duì)象。SYN28資訊網(wǎng)——每日最新資訊28at.com

另外內(nèi)置類型被稱為靜態(tài)類,它和它的實(shí)例對(duì)象在底層已經(jīng)被定義好了,無法動(dòng)態(tài)修改。我們自定義的類型被稱為動(dòng)態(tài)類,它是在解釋器運(yùn)行的過程中動(dòng)態(tài)構(gòu)建的,所以我們可以對(duì)其進(jìn)行動(dòng)態(tài)修改。SYN28資訊網(wǎng)——每日最新資訊28at.com

這里需要再強(qiáng)調(diào)一點(diǎn),Python 的動(dòng)態(tài)性、GIL 等特性,都是解釋器在將字節(jié)碼翻譯成 C 代碼時(shí)動(dòng)態(tài)賦予的,而內(nèi)置類型在編譯之后已經(jīng)是指向 C 一級(jí)的數(shù)據(jù)結(jié)構(gòu),因此也就喪失了相應(yīng)的動(dòng)態(tài)性。不過與之對(duì)應(yīng)的就是效率上的提升,因?yàn)檫\(yùn)行效率和動(dòng)態(tài)性本身就是魚與熊掌的關(guān)系。SYN28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-89706-0.html當(dāng)創(chuàng)建一個(gè) Python 對(duì)象時(shí),背后都經(jīng)歷了哪些過程?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 高級(jí)程序員必須要會(huì)的五種編程范式

下一篇: Python 代碼重構(gòu)的十個(gè)關(guān)鍵策略

標(biāo)簽:
  • 熱門焦點(diǎn)
  • K60至尊版剛預(yù)熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛?cè)缁鹑巛钡男麄髁薑60 Ultra的各種技術(shù)和硬件配置,作為競品的一加也坐不住了。一加中國區(qū)總裁李杰發(fā)布了兩條微博,表示在自家的一加Ace2上早就已經(jīng)采用了和PixelWo
  • 紅魔電競平板評(píng)測:大屏幕硬實(shí)力

    前言:三年的疫情因?yàn)橐暇W(wǎng)課的原因激活了平板市場,如今網(wǎng)課的時(shí)代已經(jīng)過去,大家的生活都恢復(fù)到了正軌,這也就意味著,真正考驗(yàn)平板電腦生存的環(huán)境來了。也就是面對(duì)著這種殘酷的
  • 一加首款折疊屏!一加Open渲染圖出爐:罕見單手可握小尺寸

    8月5日消息,此前就有爆料稱,一加首款折疊屏手機(jī)將會(huì)在第三季度上市,如今隨著時(shí)間臨近,新機(jī)的各種消息也開始浮出水面。據(jù)悉,這款新機(jī)將會(huì)被命名為“On
  • Automa-通過連接塊來自動(dòng)化你的瀏覽器

    1、前言通過瀏覽器插件可實(shí)現(xiàn)自動(dòng)化腳本的錄制與編寫,具有代表性的工具就是:Selenium IDE、Katalon Recorder,對(duì)于簡單的業(yè)務(wù)來說可快速實(shí)現(xiàn)自動(dòng)化的上手工作。Selenium IDEKat
  • K8S | Service服務(wù)發(fā)現(xiàn)

    一、背景在微服務(wù)架構(gòu)中,這里以開發(fā)環(huán)境「Dev」為基礎(chǔ)來描述,在K8S集群中通常會(huì)開放:路由網(wǎng)關(guān)、注冊(cè)中心、配置中心等相關(guān)服務(wù),可以被集群外部訪問;圖片對(duì)于測試「Tes」環(huán)境或者
  • 學(xué)習(xí)JavaScript的10個(gè)理由...

    作者 | Simplilearn編譯 | 王瑞平當(dāng)你決心學(xué)習(xí)一門語言的時(shí)候,很難選擇到底應(yīng)該學(xué)習(xí)哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標(biāo)系統(tǒng)提供非預(yù)期的輸入并監(jiān)視異常結(jié)果來發(fā)現(xiàn)軟件漏洞的方法。可以用來發(fā)現(xiàn)應(yīng)用程序、操作系統(tǒng)和網(wǎng)絡(luò)協(xié)議等中的漏洞或
  • 自研Exynos回歸!三星Galaxy S24系列將提供Exynos和驍龍雙版本

    年初,全新的三星Galaxy S23系列發(fā)布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三個(gè)版本,全系搭載超頻版驍龍8 Gen 2,雖同樣采用臺(tái)積電4nm工藝制
  • 機(jī)構(gòu)稱Q2全球智能手機(jī)出貨量同比下滑11% 蘋果份額依舊第2

    7月20日消息,據(jù)外媒報(bào)道,研究機(jī)構(gòu)的報(bào)告顯示,由于需求下滑,今年二季度全球智能手機(jī)的出貨量,同比下滑了11%,三星、蘋果等主要廠商的銷量,較去年同期均有下
Top 主站蜘蛛池模板: 崇仁县| 卢龙县| 佛学| 集贤县| 达拉特旗| 鹿泉市| 沈阳市| 奈曼旗| 梅州市| 阿坝县| 宁南县| 九龙坡区| 正阳县| 泉州市| 怀柔区| 宁蒗| 安多县| 隆子县| 乡城县| 铁力市| 西宁市| 林西县| 大田县| 凤山县| 吉林市| 安乡县| 石泉县| 东乌| 阜平县| 新民市| 常山县| 安阳市| 夏津县| 湖北省| 大同县| 万全县| 乐陵市| 怀仁县| 花垣县| 安达市| 延安市|