2015. 2. 16. 16:06
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

#! coding: utf-8 -*-

from sys import getsizeof
import types
from inspect import getmembers
from collections import (deque,defaultdict, Counter, OrderedDict, Iterable)

types_basic={
  e[1] for e in filter(lambda x : isinstance(x[1], type),getmembers(types))
}

types_basic.discard(types.InstanceType)
types_basic.discard(types.ObjectType)

types_basic.add(type(types_basic.__str__))

types_kv={dict,OrderedDict,defaultdict, types.DictProxyType,Counter}
types_listlike={list,set,frozenset, tuple, deque}

types_basic-=types_kv
types_basic-=types_listlike

types_kv=tuple(types_kv)
types_listlike=tuple(types_listlike)
types_basic=tuple(types_basic)

def get_size_of(obj):
  """
  Non-recursive function, that takes Python object.
  walk through its sub-objects and return a sum of size of each pointers
  and basic types
  """

  size=0
  seen=set()
  stack=deque()

  stack.append(obj)
  seen.add(id(obj))

  while stack:
    cur=stack.pop()

    size+=getsizeof(cur)
    if isinstance(cur, types_basic):
      seen.add(cur)
    elif isinstance(cur, types_listlike):
      for e in list(cur):
        if id(e) not in seen:
          stack.append(e)
          seen.add(id(e))
    elif isinstance(cur,types_kv):
      for k,v in cur.items():
        if id(k) not in seen:
          stack.append(k)
          seen.add(id(k))
        if id(v) not in seen:
          stack.append(v)
          seen.add(id(v))

    else:
      for attr in dir(cur):
        try:
          o= getattr(cur,attr)
        except AttributeError:
          continue
        if id(o) not in seen:
          stack.append(o)
          seen.add(id(o))

  return size





'Python' 카테고리의 다른 글

storingSnippets.py  (0) 2015.02.18
readableSize.py  (0) 2015.02.18
betterDIctionary.py  (0) 2015.02.15
ipv46.py  (0) 2015.02.15
retryLoop.py  (0) 2015.02.14
Posted by af334