当前位置: 首页 > 知识库问答 >
问题:

Python:运行Slooow的程序

经伟
2023-03-14

我有一个问题,我的熊猫数据分析运行非常缓慢,不知道是否有人可以帮助请。

如果一个帧中的IP地址是另一个帧中网络的一部分,我将尝试比较两个数据帧:

  • VFFrame包含10列,4798行:'CIDR'列包含网络
  • AssetFrame包含3368列,115816行:IPv4s包含在CIDR中匹配的IP地址(因为IPv4s可以有1到3个可能的IP地址,我不得不将其拆分并清除它们)

我正在将另外7列添加到AssetFrame,以便在匹配后获取新值。

for index, row in AssetFrame.iterrows():
    IPstore = AssetFrame.loc[index, 'ipv4s'].split(',')
    
    for index, row in VFFrame.iterrows():
        net = ipaddress.IPv4Network(VFFrame.loc[index, 'CIDR'])
    
        for i in range(len(IPstore)):
            IPstore[i] = IPstore[i].strip()
            IP = ipaddress.IPv4Address(IPstore[i])
        
            if IP in net:
                row = [IP, net]       # Used to check list of matches to export as CSV,
                TheList.append(row)   # to check my assumption below is correct.

                # All IPs will be in the same network 'CIDR' or there will be no match
                # The columns have already been added to the AssetFrame ready to take the new values
                AssetFrame.loc[index, 'comment'] = VFFrame.loc[index, 'comment']
                AssetFrame.loc[index, 'country'] = VFFrame.loc[index, 'country']
                AssetFrame.loc[index, 'city'] = VFFrame.loc[index, 'city']
                AssetFrame.loc[index, 'site-name'] = VFFrame.loc[index, 'site-name']
                AssetFrame.loc[index, 'site-id'] = VFFrame.loc[index, 'site-id']
                AssetFrame.loc[index, 'vf-device'] = VFFrame.loc[index, 'vf-device']
                AssetFrame.loc[index, 'vlan'] = VFFrame.loc[index, 'vlan']



AssetFrame:
    id            ipv4s             fqdn
0   b564a4        192.168.20.4      too.many@cats121.com
1   e454a4        192.168.20.74     too.many@dogs231.com
2   a454a4        192.168.20.84     too.many@worms456.com

VFFrame:
    subnet          mask                CIDR                Comment         vlan
0   192.168.20.0    255.255.255.224     192.168.20.0/26     Blah Blah       101
1   192.168.20.64   255.255.255.240     192.168.20.64/28    Ditto Blah      201

Result Should be:
AssetFrame:
    id        ipv4s             fqdn                    Comment         vlan
0   b564a4    192.168.20.4      too.many@cats121.com    Blah Blah       101
1   e454a4    192.168.20.74     too.many@dogs231.com    Ditto Blah      201
2   a454a4    192.168.20.84     too.many@Worms456.com   No Match        No Match

数据帧和所需输出的示例:

共有1个答案

海保臣
2023-03-14

“分而治之”是你的朋友。首先,我们有O(n³)的复杂性,这不是什么大问题。在这些情况下,第一步是了解时间在哪里损失,我可以猜出原因。loc是瓶颈。但是为了清楚的分析,我建议使用一个执行工具。我编写了perf_工具,可以指导您找到解决方案:

一些命中率

>

  • 内部循环做标量赋值时,你可以做矢量模式。AssetFrame.loc非常昂贵,调用次数太多。

    中间循环再次对每个记录进行阐述,这可以使用掩码在矢量模式下完成

    在每一行上再次顶部循环iter。

    在DataFrames之间执行一次合并操作时,可能会删除Top和Media循环。

  •  类似资料:
    • 主要内容:Python 交互式编程,编写 Python 源文件Python 是一种解释型的脚本编程语言,这样的编程语言一般支持两种代码运行方式: 1) 交互式编程 在命令行窗口中直接输入代码,按下回车键就可以运行代码,并立即看到输出结果;执行完一行代码,你还可以继续输入下一行代码,再次回车并查看结果……整个过程就好像我们在和计算机对话,所以称为交互式编程。 2) 编写源文件 创建一个源文件,将所有代码放在源文件中,让解释器逐行读取并执行源文件中的代码,直到文

    • 问题内容: 所以我有点像Python,但是我遇到了问题……运行它。大声笑 我现在正在使用IDLE,但是它没有任何用处,因为一次只能运行几行。 我还使用Komodo Edit创建实际的.py文件。 我的问题是,如何运行.py文件来测试实际程序? 我正在使用Windows 7和Komodo Edit 5作为我的IDE。在Komodo中按F5根本不起作用。 问题答案: 我很高兴你问!我只是在Wikibo

    • Traceback(最近的调用最后): 文件“C:\Users\MUHAMMAD ALI QURESHI\Anaconda3\lib\site packages\IPython\core\interactiveshell.py”,第2910行,运行代码exec(代码obj、self.user、全局用户、self.user) 文件“”,第4行,从lmfit开始。模型导入负载模型 文件“C:\User

    • 在尝试运行我的代码时出现了这个持续的错误,我无法理解它的含义以及如何使其正确。 C: \code\sentmentanalysis \venv\sentment-alysis \Scripts\python。exe“C:/code/sentimentanalysis/main.py跟踪(最近一次调用): 文件”C:/code/entimentanalysis/main。py”,第1行,在impor

    • 问题内容: 我有一个演示文件:。在Windows控制台中,我可以使用以下命令运行文件: 我该如何在Python Shell中执行文件? 问题答案: 对 python 2 使用execfile: 对 python 3 使用exec

    • 安装lein 下载安装脚本 wget https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein 把lein放到~/bin下并chmod +x lein增加可执行权限(默认我们的bash是会自动把~/bin加到PATH环境变量里的) 执行lein,自动下载安装所需的软件包 安装streamparser 如果没有安