python三高问题分析

本文探讨了在Python中处理高内存场景的方法,通过实例展示了在外连接操作如何导致数据成指数增长。同时,介绍了使用tracemalloc库来分析内存分配情况,并通过cProfile分析函数效率和网络延迟。此外,还提到了监控CPU使用、性能测试工具如ab和pef,以及如何查找特定文本。
摘要由CSDN通过智能技术生成

1.高内存

模拟高内存场景:利用两张表df1和df2以第一列做为连接键进行外关联,每张表中作为连接键的列相同的数据越是多,

在进行外关联时形成新表数据就会成指数积增长

import pandas as pd

data1 = [
    ["a", 0],
    ["a", 1],
    ["a", 2],
    ["b", 3],
    ["b", 4],
    ["b", 5],

]
data2 = [
    ["a", 6],
    ["a", 7],
    ["a", 8],
    ["b", 9],
    ["b", 10],
    ["b", 11],
]

df1 = pd.DataFrame(data1)
print("----------------df1----------------")
print(df1)

df2 = pd.DataFrame(data2)
print("----------------df2----------------")
print(df2)

df3 = pd.merge(df1, df2, on=[0], how="outer")
print("----------------d3----------------")
print(df3)

结果

----------------df1----------------
   0  1
0  a  0
1  a  1
2  a  2
3  b  3
4  b  4
5  b  5
----------------df2----------------
   0   1
0  a   6
1  a   7
2  a   8
3  b   9
4  b  10
5  b  11
----------------d3----------------
    0  1_x  1_y
0   a    0    6
1   a    0    7
2   a    0    8
3   a    1    6
4   a    1    7
5   a    1    8
6   a    2    6
7   a    2    7
8   a    2    8
9   b    3    9
10  b    3   10
11  b    3   11
12  b    4    9
13  b    4   10
14  b    4   11
15  b    5    9
16  b    5   10
17  b    5   11

分析

import linecache
import signal
import tracemalloc


def display_top(snapshot, key_type='lineno', limit=10):
    snapshot = snapshot.filter_traces((
        tracemalloc.Filter(False, "<frozen importlib._bootstrap>"),
        tracemalloc.Filter(False, "<unknown>"),
    ))
    top_stats = snapshot.statistics(key_type)

    print("Top %s lines" % limit)
    for index, stat in enumerate(top_stats[:limit], 1):
        frame = stat.traceback[0]
        print("#%s: %s:%s: %.1f KiB"
              % (index, frame.filename, frame.lineno, stat.size / 1024))
        line = linecache.getline(frame.filename, frame.lineno).strip()
        if line:
            print('    %s' % line)

    other = top_stats[limit:]
    if other:
        size = sum(stat.size for stat in other)
        print("%s other: %.1f KiB" % (len(other), size / 1024))
    total = sum(stat.size for stat in top_stats)
    print("Total allocated size: %.1f KiB" % (total / 1024))


def handler():
    snapshot = tracemalloc.take_snapshot()
    display_top(snapshot, key_type='traceback')


# 注册信号,因为会在调用过程中升到100%,所以在此之前停止
signal.signal(signal.SIGINT, handler)
tracemalloc.start()
# ... run your application ...

2.高网络延时

cprofile:分析哪一个功能模块效率低,延迟高,占用资源多

方式一

import cProfile


def fib():
    ...


cProfile.run('fib')

方式二

python3 -m cProfile xxx.py

说明

函数名含义
ncalls是指相应代码/函数被调用的次数
tottime指对应代码/函数总共执行所需要的时间
prcall(tottime percall)tottime /ncalls
cumtime指对应代码/函数总共执行所需要的时间,这里包括了它调用其他代码/函数的执行时间
cumtime percallcumtime/ncalls

traceroute

traceroute --tcp -p 端口 -n 目的ip

3.高cpu

1.top命令查看cpu使用情况

2.ps -aux 显示所有包含其他使用者的进程

3.使用abs测试linux的性能

ab -c 10 -n 100 http://192.168.0.10:10000/

4.使用pef分析调用关系

#-g 开启调用关系分析 -p 指定php-fpm的进程号2151
perf top -g -p 21515

5.查询某个目录下的具体文本

grep 具体文本 -r app
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值