| import os, sys | |
| def detectCPUs(): | |
| """ | |
| Detects the number of CPUs on a system. Cribbed from pp. | |
| """ | |
| # Linux, Unix and MacOS: | |
| if hasattr(os, "sysconf"): | |
| if os.sysconf_names.has_key("SC_NPROCESSORS_ONLN"): | |
| # Linux & Unix: | |
| ncpus = os.sysconf("SC_NPROCESSORS_ONLN") | |
| if isinstance(ncpus, int) and ncpus > 0: | |
| return ncpus | |
| else: # OSX: | |
| return int(os.popen2("sysctl -n hw.ncpu")[1].read()) | |
| # Windows: | |
| if os.environ.has_key("NUMBER_OF_PROCESSORS"): | |
| ncpus = int(os.environ["NUMBER_OF_PROCESSORS"]) | |
| if ncpus > 0: | |
| return ncpus | |
| return 1 # Default | |
| def mkdir_p(path): | |
| """mkdir_p(path) - Make the "path" directory, if it does not exist; this | |
| will also make directories for any missing parent directories.""" | |
| import errno | |
| if not path or os.path.exists(path): | |
| return | |
| parent = os.path.dirname(path) | |
| if parent != path: | |
| mkdir_p(parent) | |
| try: | |
| os.mkdir(path) | |
| except OSError,e: | |
| # Ignore EEXIST, which may occur during a race condition. | |
| if e.errno != errno.EEXIST: | |
| raise | |
| def capture(args): | |
| import subprocess | |
| """capture(command) - Run the given command (or argv list) in a shell and | |
| return the standard output.""" | |
| p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | |
| out,_ = p.communicate() | |
| return out | |
| def which(command, paths = None): | |
| """which(command, [paths]) - Look up the given command in the paths string | |
| (or the PATH environment variable, if unspecified).""" | |
| if paths is None: | |
| paths = os.environ.get('PATH','') | |
| # Check for absolute match first. | |
| if os.path.exists(command): | |
| return command | |
| # Would be nice if Python had a lib function for this. | |
| if not paths: | |
| paths = os.defpath | |
| # Get suffixes to search. | |
| pathext = os.environ.get('PATHEXT', '').split(os.pathsep) | |
| # Search the paths... | |
| for path in paths.split(os.pathsep): | |
| for ext in pathext: | |
| p = os.path.join(path, command + ext) | |
| if os.path.exists(p): | |
| return p | |
| return None | |
| def printHistogram(items, title = 'Items'): | |
| import itertools, math | |
| items.sort(key = lambda (_,v): v) | |
| maxValue = max([v for _,v in items]) | |
| # Select first "nice" bar height that produces more than 10 bars. | |
| power = int(math.ceil(math.log(maxValue, 10))) | |
| for inc in itertools.cycle((5, 2, 2.5, 1)): | |
| barH = inc * 10**power | |
| N = int(math.ceil(maxValue / barH)) | |
| if N > 10: | |
| break | |
| elif inc == 1: | |
| power -= 1 | |
| histo = [set() for i in range(N)] | |
| for name,v in items: | |
| bin = min(int(N * v/maxValue), N-1) | |
| histo[bin].add(name) | |
| barW = 40 | |
| hr = '-' * (barW + 34) | |
| print '\nSlowest %s:' % title | |
| print hr | |
| for name,value in items[-20:]: | |
| print '%.2fs: %s' % (value, name) | |
| print '\n%s Times:' % title | |
| print hr | |
| pDigits = int(math.ceil(math.log(maxValue, 10))) | |
| pfDigits = max(0, 3-pDigits) | |
| if pfDigits: | |
| pDigits += pfDigits + 1 | |
| cDigits = int(math.ceil(math.log(len(items), 10))) | |
| print "[%s] :: [%s] :: [%s]" % ('Range'.center((pDigits+1)*2 + 3), | |
| 'Percentage'.center(barW), | |
| 'Count'.center(cDigits*2 + 1)) | |
| print hr | |
| for i,row in enumerate(histo): | |
| pct = float(len(row)) / len(items) | |
| w = int(barW * pct) | |
| print "[%*.*fs,%*.*fs)" % (pDigits, pfDigits, i*barH, | |
| pDigits, pfDigits, (i+1)*barH), | |
| print ":: [%s%s] :: [%*d/%*d]" % ('*'*w, ' '*(barW-w), | |
| cDigits, len(row), | |
| cDigits, len(items)) | |