一个Python程序引发的思考

import disdef add(a, b):result = a + b + 2 + 3return resultdis.dis(add)# dis.opname 是一个列表,它按字节码值的顺序列出了所有的操作名。
print(dis.opname)# dis.opmap 是一个字典,其键是操作名,值是对应的字节码值。
print(dis.opmap)# 列出所有的字节码操作和它们对应的值:
for op, value in dis.opmap.items():print(f"{op}: {value}")

输出结果如下:

  4           0 LOAD_FAST                0 (a)2 LOAD_FAST                1 (b)4 BINARY_ADD6 LOAD_CONST               1 (2)8 BINARY_ADD10 LOAD_CONST               2 (3)12 BINARY_ADD14 STORE_FAST               2 (result)5          16 LOAD_FAST                2 (result)18 RETURN_VALUE
['<0>', 'POP_TOP', 'ROT_TWO', 'ROT_THREE', 'DUP_TOP', 'DUP_TOP_TWO', 'ROT_FOUR', '<7>', '<8>', 'NOP', 'UNARY_POSITIVE', 'UNARY_NEGATIVE', 'UNARY_NOT', '<13>', '<14>', 'UNARY_INVERT', 'BINARY_MATRIX_MULTIPLY', 'INPLACE_MATRIX_MULTIPLY', '<18>', 'BINARY_POWER', 'BINARY_MULTIPLY', '<21>', 'BINARY_MODULO', 'BINARY_ADD', 'BINARY_SUBTRACT', 'BINARY_SUBSCR', 'BINARY_FLOOR_DIVIDE', 'BINARY_TRUE_DIVIDE', 'INPLACE_FLOOR_DIVIDE', 'INPLACE_TRUE_DIVIDE', 'GET_LEN', 'MATCH_MAPPING', 'MATCH_SEQUENCE', 'MATCH_KEYS', 'COPY_DICT_WITHOUT_KEYS', '<35>', '<36>', '<37>', '<38>', '<39>', '<40>', '<41>', '<42>', '<43>', '<44>', '<45>', '<46>', '<47>', '<48>', 'WITH_EXCEPT_START', 'GET_AITER', 'GET_ANEXT', 'BEFORE_ASYNC_WITH', '<53>', 'END_ASYNC_FOR', 'INPLACE_ADD', 'INPLACE_SUBTRACT', 'INPLACE_MULTIPLY', '<58>', 'INPLACE_MODULO', 'STORE_SUBSCR', 'DELETE_SUBSCR', 'BINARY_LSHIFT', 'BINARY_RSHIFT', 'BINARY_AND', 'BINARY_XOR', 'BINARY_OR', 'INPLACE_POWER', 'GET_ITER', 'GET_YIELD_FROM_ITER', 'PRINT_EXPR', 'LOAD_BUILD_CLASS', 'YIELD_FROM', 'GET_AWAITABLE', 'LOAD_ASSERTION_ERROR', 'INPLACE_LSHIFT', 'INPLACE_RSHIFT', 'INPLACE_AND', 'INPLACE_XOR', 'INPLACE_OR', '<80>', '<81>', 'LIST_TO_TUPLE', 'RETURN_VALUE', 'IMPORT_STAR', 'SETUP_ANNOTATIONS', 'YIELD_VALUE', 'POP_BLOCK', '<88>', 'POP_EXCEPT', 'STORE_NAME', 'DELETE_NAME', 'UNPACK_SEQUENCE', 'FOR_ITER', 'UNPACK_EX', 'STORE_ATTR', 'DELETE_ATTR', 'STORE_GLOBAL', 'DELETE_GLOBAL', 'ROT_N', 'LOAD_CONST', 'LOAD_NAME', 'BUILD_TUPLE', 'BUILD_LIST', 'BUILD_SET', 'BUILD_MAP', 'LOAD_ATTR', 'COMPARE_OP', 'IMPORT_NAME', 'IMPORT_FROM', 'JUMP_FORWARD', 'JUMP_IF_FALSE_OR_POP', 'JUMP_IF_TRUE_OR_POP', 'JUMP_ABSOLUTE', 'POP_JUMP_IF_FALSE', 'POP_JUMP_IF_TRUE', 'LOAD_GLOBAL', 'IS_OP', 'CONTAINS_OP', 'RERAISE', '<120>', 'JUMP_IF_NOT_EXC_MATCH', 'SETUP_FINALLY', '<123>', 'LOAD_FAST', 'STORE_FAST', 'DELETE_FAST', '<127>', '<128>', 'GEN_START', 'RAISE_VARARGS', 'CALL_FUNCTION', 'MAKE_FUNCTION', 'BUILD_SLICE', '<134>', 'LOAD_CLOSURE', 'LOAD_DEREF', 'STORE_DEREF', 'DELETE_DEREF', '<139>', '<140>', 'CALL_FUNCTION_KW', 'CALL_FUNCTION_EX', 'SETUP_WITH', 'EXTENDED_ARG', 'LIST_APPEND', 'SET_ADD', 'MAP_ADD', 'LOAD_CLASSDEREF', '<149>', '<150>', '<151>', 'MATCH_CLASS', '<153>', 'SETUP_ASYNC_WITH', 'FORMAT_VALUE', 'BUILD_CONST_KEY_MAP', 'BUILD_STRING', '<158>', '<159>', 'LOAD_METHOD', 'CALL_METHOD', 'LIST_EXTEND', 'SET_UPDATE', 'DICT_MERGE', 'DICT_UPDATE', '<166>', '<167>', '<168>', '<169>', '<170>', '<171>', '<172>', '<173>', '<174>', '<175>', '<176>', '<177>', '<178>', '<179>', '<180>', '<181>', '<182>', '<183>', '<184>', '<185>', '<186>', '<187>', '<188>', '<189>', '<190>', '<191>', '<192>', '<193>', '<194>', '<195>', '<196>', '<197>', '<198>', '<199>', '<200>', '<201>', '<202>', '<203>', '<204>', '<205>', '<206>', '<207>', '<208>', '<209>', '<210>', '<211>', '<212>', '<213>', '<214>', '<215>', '<216>', '<217>', '<218>', '<219>', '<220>', '<221>', '<222>', '<223>', '<224>', '<225>', '<226>', '<227>', '<228>', '<229>', '<230>', '<231>', '<232>', '<233>', '<234>', '<235>', '<236>', '<237>', '<238>', '<239>', '<240>', '<241>', '<242>', '<243>', '<244>', '<245>', '<246>', '<247>', '<248>', '<249>', '<250>', '<251>', '<252>', '<253>', '<254>', '<255>']
{'POP_TOP': 1, 'ROT_TWO': 2, 'ROT_THREE': 3, 'DUP_TOP': 4, 'DUP_TOP_TWO': 5, 'ROT_FOUR': 6, 'NOP': 9, 'UNARY_POSITIVE': 10, 'UNARY_NEGATIVE': 11, 'UNARY_NOT': 12, 'UNARY_INVERT': 15, 'BINARY_MATRIX_MULTIPLY': 16, 'INPLACE_MATRIX_MULTIPLY': 17, 'BINARY_POWER': 19, 'BINARY_MULTIPLY': 20, 'BINARY_MODULO': 22, 'BINARY_ADD': 23, 'BINARY_SUBTRACT': 24, 'BINARY_SUBSCR': 25, 'BINARY_FLOOR_DIVIDE': 26, 'BINARY_TRUE_DIVIDE': 27, 'INPLACE_FLOOR_DIVIDE': 28, 'INPLACE_TRUE_DIVIDE': 29, 'GET_LEN': 30, 'MATCH_MAPPING': 31, 'MATCH_SEQUENCE': 32, 'MATCH_KEYS': 33, 'COPY_DICT_WITHOUT_KEYS': 34, 'WITH_EXCEPT_START': 49, 'GET_AITER': 50, 'GET_ANEXT': 51, 'BEFORE_ASYNC_WITH': 52, 'END_ASYNC_FOR': 54, 'INPLACE_ADD': 55, 'INPLACE_SUBTRACT': 56, 'INPLACE_MULTIPLY': 57, 'INPLACE_MODULO': 59, 'STORE_SUBSCR': 60, 'DELETE_SUBSCR': 61, 'BINARY_LSHIFT': 62, 'BINARY_RSHIFT': 63, 'BINARY_AND': 64, 'BINARY_XOR': 65, 'BINARY_OR': 66, 'INPLACE_POWER': 67, 'GET_ITER': 68, 'GET_YIELD_FROM_ITER': 69, 'PRINT_EXPR': 70, 'LOAD_BUILD_CLASS': 71, 'YIELD_FROM': 72, 'GET_AWAITABLE': 73, 'LOAD_ASSERTION_ERROR': 74, 'INPLACE_LSHIFT': 75, 'INPLACE_RSHIFT': 76, 'INPLACE_AND': 77, 'INPLACE_XOR': 78, 'INPLACE_OR': 79, 'LIST_TO_TUPLE': 82, 'RETURN_VALUE': 83, 'IMPORT_STAR': 84, 'SETUP_ANNOTATIONS': 85, 'YIELD_VALUE': 86, 'POP_BLOCK': 87, 'POP_EXCEPT': 89, 'STORE_NAME': 90, 'DELETE_NAME': 91, 'UNPACK_SEQUENCE': 92, 'FOR_ITER': 93, 'UNPACK_EX': 94, 'STORE_ATTR': 95, 'DELETE_ATTR': 96, 'STORE_GLOBAL': 97, 'DELETE_GLOBAL': 98, 'ROT_N': 99, 'LOAD_CONST': 100, 'LOAD_NAME': 101, 'BUILD_TUPLE': 102, 'BUILD_LIST': 103, 'BUILD_SET': 104, 'BUILD_MAP': 105, 'LOAD_ATTR': 106, 'COMPARE_OP': 107, 'IMPORT_NAME': 108, 'IMPORT_FROM': 109, 'JUMP_FORWARD': 110, 'JUMP_IF_FALSE_OR_POP': 111, 'JUMP_IF_TRUE_OR_POP': 112, 'JUMP_ABSOLUTE': 113, 'POP_JUMP_IF_FALSE': 114, 'POP_JUMP_IF_TRUE': 115, 'LOAD_GLOBAL': 116, 'IS_OP': 117, 'CONTAINS_OP': 118, 'RERAISE': 119, 'JUMP_IF_NOT_EXC_MATCH': 121, 'SETUP_FINALLY': 122, 'LOAD_FAST': 124, 'STORE_FAST': 125, 'DELETE_FAST': 126, 'GEN_START': 129, 'RAISE_VARARGS': 130, 'CALL_FUNCTION': 131, 'MAKE_FUNCTION': 132, 'BUILD_SLICE': 133, 'LOAD_CLOSURE': 135, 'LOAD_DEREF': 136, 'STORE_DEREF': 137, 'DELETE_DEREF': 138, 'CALL_FUNCTION_KW': 141, 'CALL_FUNCTION_EX': 142, 'SETUP_WITH': 143, 'EXTENDED_ARG': 144, 'LIST_APPEND': 145, 'SET_ADD': 146, 'MAP_ADD': 147, 'LOAD_CLASSDEREF': 148, 'MATCH_CLASS': 152, 'SETUP_ASYNC_WITH': 154, 'FORMAT_VALUE': 155, 'BUILD_CONST_KEY_MAP': 156, 'BUILD_STRING': 157, 'LOAD_METHOD': 160, 'CALL_METHOD': 161, 'LIST_EXTEND': 162, 'SET_UPDATE': 163, 'DICT_MERGE': 164, 'DICT_UPDATE': 165}
POP_TOP: 1
ROT_TWO: 2
ROT_THREE: 3
DUP_TOP: 4
DUP_TOP_TWO: 5
ROT_FOUR: 6
NOP: 9
UNARY_POSITIVE: 10
UNARY_NEGATIVE: 11
UNARY_NOT: 12
UNARY_INVERT: 15
BINARY_MATRIX_MULTIPLY: 16
INPLACE_MATRIX_MULTIPLY: 17
BINARY_POWER: 19
BINARY_MULTIPLY: 20
BINARY_MODULO: 22
BINARY_ADD: 23
BINARY_SUBTRACT: 24
BINARY_SUBSCR: 25
BINARY_FLOOR_DIVIDE: 26
BINARY_TRUE_DIVIDE: 27
INPLACE_FLOOR_DIVIDE: 28
INPLACE_TRUE_DIVIDE: 29
GET_LEN: 30
MATCH_MAPPING: 31
MATCH_SEQUENCE: 32
MATCH_KEYS: 33
COPY_DICT_WITHOUT_KEYS: 34
WITH_EXCEPT_START: 49
GET_AITER: 50
GET_ANEXT: 51
BEFORE_ASYNC_WITH: 52
END_ASYNC_FOR: 54
INPLACE_ADD: 55
INPLACE_SUBTRACT: 56
INPLACE_MULTIPLY: 57
INPLACE_MODULO: 59
STORE_SUBSCR: 60
DELETE_SUBSCR: 61
BINARY_LSHIFT: 62
BINARY_RSHIFT: 63
BINARY_AND: 64
BINARY_XOR: 65
BINARY_OR: 66
INPLACE_POWER: 67
GET_ITER: 68
GET_YIELD_FROM_ITER: 69
PRINT_EXPR: 70
LOAD_BUILD_CLASS: 71
YIELD_FROM: 72
GET_AWAITABLE: 73
LOAD_ASSERTION_ERROR: 74
INPLACE_LSHIFT: 75
INPLACE_RSHIFT: 76
INPLACE_AND: 77
INPLACE_XOR: 78
INPLACE_OR: 79
LIST_TO_TUPLE: 82
RETURN_VALUE: 83
IMPORT_STAR: 84
SETUP_ANNOTATIONS: 85
YIELD_VALUE: 86
POP_BLOCK: 87
POP_EXCEPT: 89
STORE_NAME: 90
DELETE_NAME: 91
UNPACK_SEQUENCE: 92
FOR_ITER: 93
UNPACK_EX: 94
STORE_ATTR: 95
DELETE_ATTR: 96
STORE_GLOBAL: 97
DELETE_GLOBAL: 98
ROT_N: 99
LOAD_CONST: 100
LOAD_NAME: 101
BUILD_TUPLE: 102
BUILD_LIST: 103
BUILD_SET: 104
BUILD_MAP: 105
LOAD_ATTR: 106
COMPARE_OP: 107
IMPORT_NAME: 108
IMPORT_FROM: 109
JUMP_FORWARD: 110
JUMP_IF_FALSE_OR_POP: 111
JUMP_IF_TRUE_OR_POP: 112
JUMP_ABSOLUTE: 113
POP_JUMP_IF_FALSE: 114
POP_JUMP_IF_TRUE: 115
LOAD_GLOBAL: 116
IS_OP: 117
CONTAINS_OP: 118
RERAISE: 119
JUMP_IF_NOT_EXC_MATCH: 121
SETUP_FINALLY: 122
LOAD_FAST: 124
STORE_FAST: 125
DELETE_FAST: 126
GEN_START: 129
RAISE_VARARGS: 130
CALL_FUNCTION: 131
MAKE_FUNCTION: 132
BUILD_SLICE: 133
LOAD_CLOSURE: 135
LOAD_DEREF: 136
STORE_DEREF: 137
DELETE_DEREF: 138
CALL_FUNCTION_KW: 141
CALL_FUNCTION_EX: 142
SETUP_WITH: 143
EXTENDED_ARG: 144
LIST_APPEND: 145
SET_ADD: 146
MAP_ADD: 147
LOAD_CLASSDEREF: 148
MATCH_CLASS: 152
SETUP_ASYNC_WITH: 154
FORMAT_VALUE: 155
BUILD_CONST_KEY_MAP: 156
BUILD_STRING: 157
LOAD_METHOD: 160
CALL_METHOD: 161
LIST_EXTEND: 162
SET_UPDATE: 163
DICT_MERGE: 164
DICT_UPDATE: 165Process finished with exit code 0

Q1:为什么for op, value in dis.opmap.items():print(f"{op}: {value}")打印出来的没有7和8等等(即为什么会出现索引不连续的现象)?

A1:Python 字节码的指令集并不是连续的,有些数字可能被保留为未来使用,或者在某个时候被用过但后来被弃用。

在 CPython 的发展过程中,一些字节码指令可能会被修改、移除或新增。当一个字节码指令被移除或修改时,开发者们可能会选择不使用其原来的数字编码,以避免与旧版本的字节码混淆。因此,有些数字编码可能会被跳过,导致在 dis.opmap 中出现不连续的现象。

例如,编号 78 可能在某个版本的 CPython 中用于某些指令,但后来这些指令可能被移除或替换。为了保持字节码的稳定性,新的指令可能会使用新的数字编码,而旧的编码则被保留并不再使用。

总之,这种不连续性是由于字节码指令集的历史和开发过程造成的。在设计和维护字节码指令集时,开发者们会权衡稳定性、向后兼容性和清晰性等因素。

Q2:dis.opmap输出操作名以及对应的字节码值是什么意思,为什么要将操作名对应字节码值?

A2:操作名和其对应的字节码值的关系可以类比为汇编语言中的助记符(mnemonic)和其对应的机器码。在机器级别,所有的指令都由数字(通常是二进制)表示,但为了人类的可读性和编写的便利,我们使用助记符或高级语言来编写代码。当编译或解释这些代码时,它们被转化为对应的机器码或字节码。

在 Python 字节码的上下文中:

  1. 操作名(例如:BINARY_ADDLOAD_FAST 是指令的助记符。它们是描述性的名称,用于表示字节码的操作。

  2. 字节码值 是每个操作对应的实际数值表示。它是一个整数,代表了这个操作在字节码序列中的编码。例如,BINARY_ADD 可能对应于整数 23

这种映射的存在有几个原因:

  • 可读性:操作名为人类提供了一个清晰、描述性的标签来识别各种字节码操作,而不是记住每个操作的数字编码。

  • 抽象:使用操作名可以轻松地在不同版本的 Python 或不同的实现(如 CPython、PyPy)之间迁移,即使字节码值有所变化。操作名为我们提供了一种不依赖于特定编码的方式来思考和描述操作。

  • 工具和调试:有了操作名和其对应的字节码值,开发者和工具可以轻松地进行字节码分析、调试和优化,而不需要深入到每个字节的级别。

总之,将操作名映射到字节码值提供了一种高级别、可读的方式来处理、理解和操作字节码,同时为底层实现提供了灵活性。

Q3:dis.dis(add)的反汇编结果,为什么变量索引从0开始,常量索引从1开始?

A3:在 Python 的字节码中,LOAD_FAST 操作用于加载函数内部的局部变量,而 LOAD_CONST 用于加载常量。这两者使用的索引方式略有不同,原因如下:

  1. 局部变量索引(LOAD_FAST:

    • 当函数被编译为字节码时,局部变量(包括函数参数)会被放入一个局部变量数组中。索引 0, 1, 2, … 对应于该数组中的位置。

    • 在你提供的例子中,函数参数 ab 分别占据了索引 01result 是在函数体内部定义的局部变量,所以它被分配了索引 2

  2. 常量索引(LOAD_CONST:

    • 当函数被编译时,所有在函数中用到的常量都会被放入一个常量元组中。这个元组是按照常量首次出现的顺序进行排列的。

    • 但有一个特点:这个常量元组的第一个元素通常是 None。所以实际上,元组的内容可能是 (None, 2, 3, ...)。因此,常量 2 有索引 1,常量 3 有索引 2

      这里的 None 是为了处理那些不返回任何值的函数。在 Python 中,如果函数没有显式的 return 语句,它将返回 None。这样的处理方式确保了每个函数都有一个返回值,即使它是隐式的 None

总的来说,这两种不同的索引策略都是基于 Python 的内部实现决策。局部变量从 0 开始是自然的,因为它们在函数内部首次出现时就被分配了。常量元组从 1 开始的原因则是因为索引 0 通常被 None 占据。

既然如此,那我将这个程序稍微改动一下

import disdef add(a, b):result = 2 + 3return resultdis.dis(add)

输出结果为:

  4           0 LOAD_CONST               1 (5)2 STORE_FAST               2 (result)5           4 LOAD_FAST                2 (result)6 RETURN_VALUE

Q4:反汇编的结果中为什么result变量的索引是2呢?不应该是0吗?

A4:在上述例子中,函数 add 有两个参数:ab。在字节码层面,函数的参数也被视为局部变量,并被赋予局部变量索引。

在函数的局部变量表中,参数会首先被分配索引,从 0 开始。然后函数体内部定义的局部变量会继续被分配索引。

所以,在上述函数中:

  • 参数 a 被分配了索引 0
  • 参数 b 被分配了索引 1
  • 局部变量 result 被分配了索引 2

这就是为什么 result 的索引是 2,而不是 0

Q5:那为什么反汇编出来没看到2、3呢,怎么直接冒出来了个5?

A5:在上述函数中,有以下代码段:

result = 2 + 3

当 Python 编译这段代码时,它会优化常量表达式。这意味着编译器会预先计算 2 + 3,得到值 5,然后直接在字节码中使用这个值。因此,你不会看到单独的 23 在字节码中,而是直接看到它们的和,即 5

这种优化是为了提高执行效率。由于 2 + 3 是一个常量表达式(即它的值在编译时就可以确定),没有必要在运行时再次计算它。

在你给出的 dis.dis(add) 输出中,以下这行:

0 LOAD_CONST               1 (5)

正是因为这种优化。这里,LOAD_CONST 直接加载了常量 5,这个 5 就是 2 + 3 的预计算结果。

Q6:运行这个python程序的时候也没出现pyc文件呀?

A6:将 .py 文件编译为 .pyc 文件的过程是将 Python 源代码编译为字节码。当你在 Python 中导入一个模块时,这一过程会自动发生,并将 .pyc 文件保存在 __pycache__ 目录下。

但如果你想手动编译 .py 文件,有以下几种方法:

  1. 使用 py_compile 模块

    Python 的标准库中有一个名为 py_compile 的模块,它提供了编译 Python 源文件的功能。

    import py_compilepy_compile.compile('your_script.py')
    

    运行上述代码后,你会在当前目录的 __pycache__ 子目录中找到编译后的 .pyc 文件。

  2. 使用 compileall 模块

    如果你想一次性编译多个文件或整个目录,你可以使用 compileall 模块。

    import compileallcompileall.compile_dir('.', force=True)
    

    这将会编译当前目录下的所有 .py 文件。

  3. 命令行方式

    你还可以直接从命令行使用上述模块,不需要写一个脚本。例如:

    python -m py_compile your_script.py
    

    或者编译整个目录:

    python -m compileall .
    

无论使用哪种方法,编译后的 .pyc 文件通常会被保存在 __pycache__ 目录中,并带有与 Python 解释器版本对应的后缀。例如,对于 Python 3.9,你可能会看到名为 your_script.cpython-39.pyc 的文件。

Q7:python -m py_compile Test.py 是什么含义

A7:在 Python 命令行界面,-m 标志的含义是 “module”,它允许你运行一个 Python 模块作为一个脚本。

当你执行 python -m module_name 时,Python 将会查找名为 module_name 的模块并执行它,就像你直接运行一个脚本文件一样。这种方式特别有用,因为有些模块包含了可以作为脚本执行的代码(即当模块中存在 if __name__ == "__main__": 语句时)。

在你给出的命令 python -m py_compile Test.py 中:

  • -m 告诉 Python 要运行一个模块。
  • py_compile 是你要运行的模块的名称。
  • Test.py 是传递给 py_compile 模块的参数,表示你要编译的 Python 文件。

事实上,这种方式使得你可以方便地运行标准库中的模块,或者其他任何位置的模块,而不需要知道其确切的路径。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/26887.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于机器视觉应用开发四大软件薪资分析(华东)

&#xff08;QQ群有答疑&#xff09;视觉人机器视觉-海康机器视觉Visionmaster二次开发课程-零基础小白快速上手VM开发系列课程 现场市场总和占用率我们称作四大软件分别是 1.Visionmaster 2.Halcon 3.Visionpro 4.Opencv 如果大家要详细了解四大软件的应用以及详细情况&a…

Vue——webpack

webpack 一、Install1.全局安装2.局部安装 二、总结1.打包2.定义脚本3.配置文件定义&#xff08;webpack.config.js)4.项目重新加载依赖5.webpack打包Css6.style-loader 一、Install 1.全局安装 npm install webpack webpack-cli -g2.局部安装 以项目为单位&#xff0c;一个项…

python中的matplotlib画饼图(数据分析与可视化)

直接开始 1、先安装pandas和matplotlib pip install pandas pip install matplotlib2、然后在py文件中导入 import pandas as pd import matplotlib.pyplot as plt3、然后直接写代码 import pandas as pd import matplotlib.pyplot as pltpd.set_option("max_columns&…

2023牛客暑期多校训练营7-c-Beautiful Sequence

思路&#xff1a; &#xff0c;则有&#xff0c;也就是说只要知道A1就可以求任意A。由于A是升序排列&#xff0c;所以对于任意&#xff0c;二进制所包含1的最高位第k位来说&#xff0c;表明与第k位相反&#xff0c;要大一些&#xff0c;所以它的第k位为1&#xff0c;的第k位为…

c++使用条件变量实现生产消费问题(跨平台)

1. 生产者线程 思路&#xff1a;队列满了的情况下, 触发条件变量wait, 等待消费线程消费后唤醒继续生产. void ProducerThreadFunc() {while(1) { while(/* 容器已满 */) { /* 线程等待, 直到消费者消费后唤醒继续执行 */ }/* 生产动作 */ } }2. 消…

【Linux命令详解 | cp命令】Linux系统中用于复制文件或目录的命令

文章标题 简介参数列表二&#xff0c;使用介绍1. 复制单个文件2. 复制多个文件3. 复制目录4. 保留文件属性5. 创建链接6. 强制覆盖7. 显示复制进度8. 创建备份9. 只有当源文件比目标文件新时才复制10. 复制链接文件 总结 简介 cp命令在Linux系统中用于复制文件或目录。其功能强…

uniapp根据高度表格合并

没有发现比较友好的能够合并表格单元格插件就自己简单写了一个,暂时格式比较固定 一、效果如下 二、UI视图+逻辑代码 <template><view><uni-card :is-shadow="false" is-full

出现Error: Cannot find module ‘compression-webpack-plugin‘错误

错误&#xff1a; 解决&#xff1a;npm install --save-dev compression-webpack-plugin1.1.12 版本问题

nginx+flask+uwsgi部署遇到的坑

文章目录 1.环境&#xff1a;2.uwsgi_conf.ini具体配置内容3.nginx 具体配置4.具体命令(注意使用pip3命令安装)5.服务异常排查 1.环境&#xff1a; centos8 uWSGI 2.0.22 gmssl 3.2.2 nginx version: nginx/1.18.0 项目目录&#xff1a; 2.uwsgi_conf.ini具体配置内容 [uws…

回归预测 | MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-BiGRU鹈鹕…

USB采集卡如何打pts

一、使用采集卡提供的pts 二、手动打pts 1.usb采集设备pts的问题 2.采集卡驱动&#xff0c;UVC/UAC&#xff0c;ffmpeg的关系 3.如何自己打pts 4.音视频同步调优 5.NTP等联网调时工具带来的不同步问题 一、使用采集卡提供的pts 我们用使用pc摄像头和使用pc麦克风声卡里的方法&…

Butterfly 安装文档(一) 快速开始

安装 在你的Hexo根目录里面 git clone -b master https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly 应用主题 修改 Hexo 根目录下的 _config.yml&#xff0c;把主题改为 butterfly theme: butterfly 安装插件 如果你没有 pug 以及 stylus 的渲染…

阻抗是什么?什么时候要考虑阻抗匹配?

在电路设计中&#xff0c;我们常常碰到跟阻抗有关的问题&#xff0c;那么到底什么是阻抗&#xff1f; 在具有电阻、电感和电容的电路里&#xff0c;对电路中电流所起的阻碍作用叫做阻抗。常用Z来表示&#xff0c;它的值由交流电的频率、电阻R、电感L、电容C相互作用来决定。由…

vue3学习-Pinia状态管理

Pinia 定义一个Store import { defineStore } from pinia export const useStore defineStore(main, {})这个 name&#xff0c;也称为 id&#xff0c;是必要的&#xff0c;Pinia 使用它来将 store 连接到 devtools。 将返回的函数命名为 use… 是跨可组合项的约定&#xff0…

RocketMQ使用

RocketMQ角色 RocketMQ的基本概念 同步发送消息 /*** author* create 2023-04-08 17:24* 发送同步消息* 适用于重要的消息 例如消息通知&#xff0c;短信通知*/ public class SyncProducer {public static void main(String[] args) throws Exception {String topic"…

re学习(29)攻防世界-CatFly(复原反汇编)

因为这是一个.dll文件&#xff0c;在Linux上运行一下&#xff1a; 找到主要函数&#xff1a;&#xff08;以及由上面三部分对应的代码部分&#xff09; __int64 __fastcall main(int a1, char **a2, char **a3) {size_t v3; // rbx__int16 v5[4]; // [rsp10h] [rbp-4B0h] B…

【MCU学习】GD32F427VG开发

&#xff08;一&#xff09;学习文档和例程 兆易创新GD32 MCU参考资料下载 1.GD232F4xx的Keil芯片支持包 2.标准固件库和示例程序 3.GD32F4xx_固件库使用指南_Rev1.2 4.用户手册&#xff1a;GD32F4xx_User_Manual_Rev2.8_CN 5.数据手册&#xff1a;GD32F427xx_Datasheet_Rev…

通过MySQL删除Hive元数据信息

之前遇到过一个问题&#xff0c;在进行Hive的元数据采集时&#xff0c;因为Hive表的文件已经被删除了&#xff0c;当时是无法删除表&#xff0c;导致元数据采集也发生了问题&#xff0c;所以希望通过删除Hive表的元数据解决上述问题。 之前安装时&#xff0c;经过特定的配置后…

单片机实现动态内存管理

1.简介 多数传统的单片机并没有动态内存管理功能。单片机通常具有有限的存储资源&#xff0c;包括固定大小的静态RAM&#xff08;SRAM&#xff09;用于数据存储和寄存器用于特定功能。这些资源在编译时被分配并且在程序的整个生命周期中保持不变。 2.动态内存管理好处 灵活性和…

SpringBoot使用@Autowired将实现类注入到List或者Map集合中

前言 最近看到RuoYi-Vue-Plus翻译功能 Translation的翻译模块配置类TranslationConfig&#xff0c;其中有一个注入TranslationInterface翻译接口实现类的写法让我感到很新颖&#xff0c;但这种写法在Spring 3.0版本以后就已经支持注入List和Map&#xff0c;平时都没有注意到这…