Python tips: 什么是*args和**kwargs?

本文介绍了Python中*args和**kwargs的用法,详细解释了它们如何收集多个位置参数和关键字参数,并给出了实例演示。

https://www.cnblogs.com/fengmk2/archive/2008/04/21/1163766.html

Python tips: 什么是*args和**kwargs?

先来看个例子:

def foo(*args, **kwargs):
    print 'args = ', args
    print 'kwargs = ', kwargs
    print '---------------------------------------'

if __name__ == '__main__':
    foo(1,2,3,4)
    foo(a=1,b=2,c=3)
    foo(1,2,3,4, a=1,b=2,c=3)
    foo('a', 1, None, a=1, b='2', c=3)
输出结果如下:

args =  (1, 2, 3, 4)
kwargs =  {}
---------------------------------------
args =  ()
kwargs =  {'a': 1, 'c': 3, 'b': 2}
---------------------------------------
args =  (1, 2, 3, 4)
kwargs =  {'a': 1, 'c': 3, 'b': 2}
---------------------------------------
args =  ('a', 1, None)
kwargs =  {'a': 1, 'c': 3, 'b': '2'}
---------------------------------------

可以看到,这两个是python中的可变参数。*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个dict。并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前,像foo(a=1, b='2', c=3, a', 1, None, )这样调用的话,会提示语法错误“SyntaxError: non-keyword arg after keyword arg”。

 

呵呵,知道*args和**kwargs是什么了吧。还有一个很漂亮的用法,就是创建字典:

    def kw_dict(**kwargs):
        return kwargs
    print kw_dict(a=1,b=2,c=3) == {'a':1, 'b':2, 'c':3}

其实python中就带有dict类,使用dict(a=1,b=2,c=3)即可创建一个字典了。

 

“人生苦短,我用python。”

Technorati 标签: python, tuple, dict, *args, **kwargs


Exception in thread Thread-1: Traceback (most recent call last): File "D:\python377\lib\threading.py", line 926, in _bootstrap_inner self.run() File "D:\python377\lib\threading.py", line 870, in run self._target(*self._args, **self._kwargs) File "D:\python377\lib\multiprocessing\pool.py", line 412, in _handle_workers pool._maintain_pool() File "D:\python377\lib\multiprocessing\pool.py", line 248, in _maintain_pool self._repopulate_pool() File "D:\python377\lib\multiprocessing\pool.py", line 241, in _repopulate_pool w.start() File "D:\python377\lib\multiprocessing\process.py", line 112, in start self._popen = self._Popen(self) File "D:\python377\lib\multiprocessing\context.py", line 322, in _Popen return Popen(process_obj) File "D:\python377\lib\multiprocessing\popen_spawn_win32.py", line 72, in __init__ None, None, False, 0, env, None, None) OSError: [WinError 1455] 页面文件太小,无法完成操作。 Traceback (most recent call last): File "<string>", line 1, in <module> File "D:\python377\lib\multiprocessing\spawn.py", line 105, in spawn_main exitcode = _main(fd) File "D:\python377\lib\multiprocessing\spawn.py", line 114, in _main prepare(preparation_data) File "D:\python377\lib\multiprocessing\spawn.py", line 225, in prepare _fixup_main_from_path(data['init_main_from_path']) File "D:\python377\lib\multiprocessing\spawn.py", line 277, in _fixup_main_from_path run_name="__mp_main__") File "D:\python377\lib\runpy.py", line 263, in run_path pkg_name=pkg_name, script_name=fname) File "D:\python377\lib\runpy.py", line 96, in _run_module_code mod_name, mod_spec, pkg_name, script_name) File "D:\python377\lib\runpy.py", line 85, in _run_code exec(code, run_globals) File "D:\code\nba_random_forest_model.py", line 1, in <module> import pandas as pd File "D:\python377\lib\site-packages\pandas\__init__.py", line 17, in <module> "Unable to import required dependencies:\n" + "\n".join(missing_dependencies) ImportError: Unable to import required dependencies: numpy: IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE! Importing the numpy C-extensions failed. This error can happen for many reasons, often due to issues with your setup or how NumPy was installed. We have compiled some common reasons and troubleshooting tips at: https://numpy.org/devdocs/user/troubleshooting-importerror.html Please note and check the following: * The Python version is: Python3.7 from "D:\python377\python.exe" * The NumPy version is: "1.19.5" and make sure that they are the versions you expect. Please carefully study the documentation linked above for further help. Original error was: DLL load failed: 出现了内部错误。 D:\python377\lib\site-packages\sklearn\ensemble\weight_boosting.py:29: DeprecationWarning: numpy.core.umath_tests is an internal NumPy module and should not be imported. It will be removed in a future NumPy release. from numpy.core.umath_tests import inner1d D:\python377\lib\site-packages\sklearn\ensemble\weight_boosting.py:29: DeprecationWarning: numpy.core.umath_tests is an internal NumPy module and should not be imported. It will be removed in a future NumPy release. from numpy.core.umath_tests import inner1d D:\python377\lib\site-packages\sklearn\ensemble\weight_boosting.py:29: DeprecationWarning: numpy.core.umath_tests is an internal NumPy module and should not be imported. It will be removed in a future NumPy release. from numpy.core.umath_tests import inner1d D:\python377\lib\site-packages\sklearn\ensemble\weight_boosting.py:29: DeprecationWarning: numpy.core.umath_tests is an internal NumPy module and should not be imported. It will be removed in a future NumPy release. from numpy.core.umath_tests import inner1d D:\python377\lib\site-packages\sklearn\ensemble\weight_boosting.py:29: DeprecationWarning: numpy.core.umath_tests is an internal NumPy module and should not be imported. It will be removed in a future NumPy release. from numpy.core.umath_tests import inner1d D:\python377\lib\site-packages\sklearn\ensemble\weight_boosting.py:29: DeprecationWarning: numpy.core.umath_tests is an internal NumPy module and should not be imported. It will be removed in a future NumPy release. from numpy.core.umath_tests import inner1d 在机器学习的过程中出现这样的问题是怎么回事
最新发布
09-19
<think> 首先,我收到了用户的查询,是关于Python机器学习中遇到的两个错误:OSError [WinError 1455] 页面文件太小ImportError导入numpy C-扩展失败。用户提到了使用pandas导入numpy时这些问题发生在Windows系统上。我需要参考用户提供的站内引用,这些引用提供了相关上下文,比如卸载重装库、C扩展未构建等常见解决方案。 接下来,我分析用户的核心需求:找出错误原因。用户的问题明确指出是在机器学习训练过程中,使用Python 3.7pandas时出现的。这暗示了资源密集型操作可能导致内存不足或环境冲突。站内引用[1]、[2]、[3]、[4]都涉及到安装问题C扩展错误,这给了我线索。 我从错误代码入手。WinError 1455对应页面文件太小,表示系统虚拟内存不足。这可能是因为机器学习任务消耗大量内存触发Windows的页面交换机制。同时,ImportError指向numpy C扩展失败,这通常源于环境不一致或安装损坏。 结合站内引用,我思考可能的原因。引用[1]提到卸载重装库解决安装问题,但用户当前错误涉及运行时资源不足,表明安装后操作引发的问题。引用[2]、[3]、[4]描述了类似C扩展错误,建议重建C扩展的命令,但用户场景是导入时失败,可能由于卸载不干净的残留或环境冲突导致。引用[5]无关,忽略。 我构建回答结构:先解释每个错误原因,再提供解决方案。考虑分为OSError(内存问题)ImportError(环境问题)两部分。OSError原因包括内存耗尽、虚拟内存设置不足任务占用资源;ImportError原因包括安装损坏、环境冲突不匹配的库版本。解决方案应覆盖这些方面,如调整虚拟内存、重装库、使用虚拟环境等。 确保回答清晰可靠:使用中文,结构分点,语言专业但易懂。最后生成相关问题,基于常见机器学习痛点,如内存优化、环境管理、错误排查等。相关问题要与主题紧密相关,帮助用户深入。 现在,组织回答:开头总结问题,然后逐一分析原因,最后给出解决方案相关问题。引用站内内容时自然标注,如[^1],[^2]。整个思考过程确保逻辑连贯,覆盖所有引用要点。 </think> 好的,这个问题在 Windows 环境下进行机器学习训练时比较常见,尤其是在使用内存密集型库(如 pandas/numpy)处理大数据集时。结合您提供的引用信息具体错误信息,我们来分析一下这两个错误的原因: ## 错误原因分析 1. **`OSError: [WinError 1455] 页面文件太小,无法完成操作`** * **核心原因:系统虚拟内存(页面文件)不足。** * **具体触发场景:** 在进行机器学习模型训练时,Python 进程(特别是导入处理大型数据集的 pandas/numpy 库,或者模型本身如 TensorFlow/PyTorch 加载数据、计算梯度时)需要申请大量内存。 * **内存分配过程:** 当程序需要的内存超过物理 RAM 的可用容量时,操作系统会将物理 RAM 中暂时不活跃的数据“换出”(Page Out)到硬盘上的**页面文件**(`pagefile.sys`)中,腾出空间加载当前需要的数据(“换入”或 Page In)。如果程序所需的总内存(物理RAM + 页面文件)超过了 Windows 为页面文件设置的最大限制,或者页面文件本身碎片化严重/空间不足,就会抛出 `WinError 1455`。 * **为什么在导入 numpy/pandas 时出现?** 导入大型库本身就需要加载大量代码数据到内存。更重要的是,在机器学习管道中,紧随导入之后的操作往往是加载非常大的训练数据集(使用 pandas 的 `read_csv` 等)或者初始化复杂的模型结构(可能依赖 numpy 的数组操作),这些操作是极其消耗内存的峰值点。如果此时物理 RAM 接近耗尽且页面文件配置不足,错误就会在导入或紧接导入后的操作中爆发[^1][^2][^3]。 2. **`ImportError: 导入 numpy C - 扩展失败` 或类似信息** * **核心原因:Python 解释器无法正确加载或初始化 NumPy 编译的 C 语言扩展模块(核心加速部分)。** * **具体原因分析(结合引用常见问题):** * **安装不完整或损坏:** 这是最常见的原因之一。安装过程中(尤其是通过 pip 或 conda)下载预编译的二进制包(wheel)时,如果网络中断、磁盘写入错误、杀毒软件干扰,或者之前卸载不彻底残留了损坏的文件,都可能导致关键的 `.pyd` (Windows DLL) 文件缺失或无效[^1][^2][^3][^4]。 * **环境冲突:** 系统中存在多个 Python 解释器(如系统自带 Python、Anaconda Python、PyCharm 项目虚拟环境中的 Python)或者多个版本的 NumPy、其他依赖库(如 MKL - Math Kernel Library)。当尝试导入时,Python 可能加载了错误的、不兼容的动态链接库(DLL)。例如,一个环境中的 numpy 依赖特定版本的 MKL,而另一个环境提供了冲突的版本[^2][^4]。 * **运行时资源耗尽(与错误1的联系):** 这是一个关键点。Windows 在加载动态链接库(DLL,如 numpy C 扩展对应的`.pyd`文件)时,也需要分配内存。如果在尝试加载 numpy C 扩展的瞬间,系统已经处于**极度内存压力**之下(物理RAM耗尽且页面文件也受限或不足),操作系统可能无法满足加载 DLL 所需的内存分配请求,导致 DLL 加载失败,从而抛出导入 C 扩展的错误[^3]。**错误1往往是错误2的诱因或伴随症状。** * **编译器/运行时库不兼容:** 极少数情况下,如果 NumPy 是用特定版本的 Visual Studio 编译的(这是构建 Windows wheel 包的常规方式),而你的系统缺少对应的 Visual C++ Redistributable runtime libraries,也可能导致加载失败。不过,pip/conda 安装的包通常会处理这些依赖。 ## 总结这两个错误频繁同时出现的根源 在机器学习训练场景下,尤其是 Windows 系统: 1. **内存需求高峰:** 导入 pandas/numpy *后紧接着* 加载大型数据集或初始化复杂模型会产生巨大的、超出物理 RAM 容量的内存需求。 2. **虚拟内存瓶颈:** Windows 默认或当前配置的页面文件不足以容纳这次内存需求高峰。 3. **内存压力下的副作用:** 在系统竭尽全力应对这次内存高峰时(RAM 交换频繁,页面文件吃紧),任何需要额外内存的操作(比如加载一个 DLL/C 扩展)都可能失败。 4. **依赖加载时机:** 导入 numpy/pandas 的过程正是需要加载其高性能 C 扩展(`.pyd` DLLs)的时候。因此,系统级的内存不足 (`WinError 1455`) 直接导致了 DLL 加载失败 (`ImportError: C-extension failed`)。 ## 解决方案方向 (针对上述原因) 1. **解决页面文件太小错误 (WinError 1455):** * **增加页面文件大小:** 手动增大 Windows 虚拟内存(页面文件)的大小。建议设置为系统管理的文件大小,或者设置一个初始大小最大大小(例如,初始大小=物理 RAM 大小,最大大小=物理 RAM 的 1.5-3 倍)。参考步骤:`系统属性` -> `高级` -> `性能设置` -> `高级` -> `虚拟内存更改`。 * **释放物理内存:** 关闭不必要的后台程序进程(浏览器标签页、Office软件等消耗内存的大户)。 * **优化数据处理:** * 使用 `pandas.read_csv(chunksize=...)` 分块读取大型数据集。 * 使用更高效的数据类型(例如 `float32` 代替 `float64`, `category` 类型代替字符串)。 * 及时删除不再需要的中间变量 (`del variable_name`),并调用 `gc.collect()` 手动触发垃圾回收。 * 考虑使用 `dask` 等库进行内存外计算。 * **增加物理内存 (RAM):** 如果经济条件允许,升级到更大的 RAM 是根本解决方案。 2. **解决 NumPy C 扩展导入失败错误:** * **在内存充足的环境下重装:** * 创建一个新的、干净的虚拟环境 (强烈推荐使用 `venv` 或 `conda`). * 确保系统物理内存虚拟内存充足(先解决或缓解错误1的条件)。 * 在该环境中使用 `pip` 或 `conda` **重新安装** numpy、pandas 及其依赖(如 scipy)。优先使用 `conda` 因为它能更好地管理二进制依赖(特别是 MKL)[^1][^5]。 * 命令示例 (在激活的虚拟环境中): ```bash conda install numpy pandas scipy # 使用 conda # 或 pip install --upgrade --no-cache-dir numpy pandas # 使用 pip, 加 --no-cache-dir 确保下载新包 ``` * **彻底卸载旧版本:** 在重装之前,确保旧版本被完全卸载。有时需要手动删除残留文件(如旧虚拟环境目录、`site-packages` 里的残留)。 * **检查依赖库:** 确保安装了所需的 Microsoft Visual C++ Redistributable(通常安装 Anaconda 或使用官方 Python 安装程序会包含)。 * **避免混合安装源:** 尽量在同一个环境内使用同一种包管理工具(全用 conda 或全用 pip),避免混用导致库冲突。 * **重建 C 扩展 (作为最后手段):** 如果怀疑安装包本身损坏,可以尝试下载 numpy 源码包,进入目录后运行 `python setup.py build_ext --inplace --force`(如引用[2][3][4]所述),但这通常不如重新下载预编译的二进制包方便可靠。 ## 优先处理建议 1. **首先解决内存问题 (WinError 1455):** 因为它是触发 C 扩展导入失败的常见直接原因。尝试增加页面文件优化代码以减少峰值内存需求。 2. **在内存问题缓解后,再处理 C 扩展问题:** 在一个内存压力较小的状态下,创建一个新的虚拟环境并重新安装 numpy/pandas 通常能解决 C 扩展导入失败的问题[^1][^5]。如果新环境安装后导入成功,说明之前的环境很可能损坏或有冲突。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值