Merge pull request #1689 from scrapy/remove-lsprof

[MRG+1] Remove --lsprof command-line option.
This commit is contained in:
Daniel Graña 2016-01-20 16:52:25 -03:00
commit 56b69d2ea8
3 changed files with 1 additions and 130 deletions

View File

@ -7,7 +7,6 @@ import pkg_resources
import scrapy import scrapy
from scrapy.crawler import CrawlerProcess from scrapy.crawler import CrawlerProcess
from scrapy.xlib import lsprofcalltree
from scrapy.commands import ScrapyCommand from scrapy.commands import ScrapyCommand
from scrapy.exceptions import UsageError from scrapy.exceptions import UsageError
from scrapy.utils.misc import walk_modules from scrapy.utils.misc import walk_modules
@ -144,7 +143,7 @@ def execute(argv=None, settings=None):
sys.exit(cmd.exitcode) sys.exit(cmd.exitcode)
def _run_command(cmd, args, opts): def _run_command(cmd, args, opts):
if opts.profile or opts.lsprof: if opts.profile:
_run_command_profiled(cmd, args, opts) _run_command_profiled(cmd, args, opts)
else: else:
cmd.run(args, opts) cmd.run(args, opts)
@ -152,17 +151,11 @@ def _run_command(cmd, args, opts):
def _run_command_profiled(cmd, args, opts): def _run_command_profiled(cmd, args, opts):
if opts.profile: if opts.profile:
sys.stderr.write("scrapy: writing cProfile stats to %r\n" % opts.profile) sys.stderr.write("scrapy: writing cProfile stats to %r\n" % opts.profile)
if opts.lsprof:
sys.stderr.write("scrapy: writing lsprof stats to %r\n" % opts.lsprof)
loc = locals() loc = locals()
p = cProfile.Profile() p = cProfile.Profile()
p.runctx('cmd.run(args, opts)', globals(), loc) p.runctx('cmd.run(args, opts)', globals(), loc)
if opts.profile: if opts.profile:
p.dump_stats(opts.profile) p.dump_stats(opts.profile)
k = lsprofcalltree.KCacheGrind(p)
if opts.lsprof:
with open(opts.lsprof, 'w') as f:
k.output(f)
if __name__ == '__main__': if __name__ == '__main__':
execute() execute()

View File

@ -65,8 +65,6 @@ class ScrapyCommand(object):
help="disable logging completely") help="disable logging completely")
group.add_option("--profile", metavar="FILE", default=None, group.add_option("--profile", metavar="FILE", default=None,
help="write python cProfile stats to FILE") help="write python cProfile stats to FILE")
group.add_option("--lsprof", metavar="FILE", default=None,
help="write lsprof profiling stats to FILE")
group.add_option("--pidfile", metavar="FILE", group.add_option("--pidfile", metavar="FILE",
help="write process ID to FILE") help="write process ID to FILE")
group.add_option("-s", "--set", action="append", default=[], metavar="NAME=VALUE", group.add_option("-s", "--set", action="append", default=[], metavar="NAME=VALUE",

View File

@ -1,120 +0,0 @@
# lsprofcalltree.py: lsprof output which is readable by kcachegrind
# David Allouche
# Jp Calderone & Itamar Shtull-Trauring
# Johan Dahlin
from __future__ import print_function
import optparse
import os
import sys
try:
import cProfile
except ImportError:
raise SystemExit("This script requires cProfile from Python 2.5")
def label(code):
if isinstance(code, str):
return ('~', 0, code) # built-in functions ('~' sorts at the end)
else:
return '%s %s:%d' % (code.co_name,
code.co_filename,
code.co_firstlineno)
class KCacheGrind(object):
def __init__(self, profiler):
self.data = profiler.getstats()
self.out_file = None
def output(self, out_file):
self.out_file = out_file
print('events: Ticks', file=out_file)
self._print_summary()
for entry in self.data:
self._entry(entry)
def _print_summary(self):
max_cost = 0
for entry in self.data:
totaltime = int(entry.totaltime * 1000)
max_cost = max(max_cost, totaltime)
print('summary: %d' % (max_cost,), file=self.out_file)
def _entry(self, entry):
out_file = self.out_file
code = entry.code
#print >> out_file, 'ob=%s' % (code.co_filename,)
if isinstance(code, str):
print('fi=~', file=out_file)
else:
print('fi=%s' % (code.co_filename,), file=out_file)
print('fn=%s' % (label(code),), file=out_file)
inlinetime = int(entry.inlinetime * 1000)
if isinstance(code, str):
print('0 ', inlinetime, file=out_file)
else:
print('%d %d' % (code.co_firstlineno, inlinetime), file=out_file)
# recursive calls are counted in entry.calls
if entry.calls:
calls = entry.calls
else:
calls = []
if isinstance(code, str):
lineno = 0
else:
lineno = code.co_firstlineno
for subentry in calls:
self._subentry(lineno, subentry)
print(file=out_file)
def _subentry(self, lineno, subentry):
out_file = self.out_file
code = subentry.code
#print >> out_file, 'cob=%s' % (code.co_filename,)
print('cfn=%s' % (label(code),), file=out_file)
if isinstance(code, str):
print('cfi=~', file=out_file)
print('calls=%d 0' % (subentry.callcount,), file=out_file)
else:
print('cfi=%s' % (code.co_filename,), file=out_file)
print('calls=%d %d' % (
subentry.callcount, code.co_firstlineno), file=out_file)
totaltime = int(subentry.totaltime * 1000)
print('%d %d' % (lineno, totaltime), file=out_file)
def main(args):
usage = "%s [-o output_file_path] scriptfile [arg] ..."
parser = optparse.OptionParser(usage=usage % sys.argv[0])
parser.allow_interspersed_args = False
parser.add_option('-o', '--outfile', dest="outfile",
help="Save stats to <outfile>", default=None)
if not sys.argv[1:]:
parser.print_usage()
sys.exit(2)
options, args = parser.parse_args()
if not options.outfile:
options.outfile = '%s.log' % os.path.basename(args[0])
sys.argv[:] = args
prof = cProfile.Profile()
try:
try:
prof = prof.run('execfile(%r)' % (sys.argv[0],))
except SystemExit:
pass
finally:
kg = KCacheGrind(prof)
kg.output(file(options.outfile, 'w'))
if __name__ == '__main__':
sys.exit(main(sys.argv))