|
5 | 5 | import logging |
6 | 6 | from builtins import object, zip |
7 | 7 | from collections import OrderedDict |
| 8 | +from pathlib import Path |
8 | 9 |
|
9 | 10 | import numpy as np |
10 | 11 | import pandas as pd |
11 | 12 |
|
12 | | -from activitysim.core import chunk, util, workflow |
| 13 | +from activitysim.core import chunk, timing, util, workflow |
13 | 14 |
|
14 | 15 | logger = logging.getLogger(__name__) |
15 | 16 |
|
@@ -275,6 +276,12 @@ def to_series(x): |
275 | 276 |
|
276 | 277 | assert assignment_expressions.shape[0] > 0 |
277 | 278 |
|
| 279 | + if state.settings.expression_profile: |
| 280 | + perf_log_file = Path(trace_label + ".log") |
| 281 | + else: |
| 282 | + perf_log_file = None |
| 283 | + performance_timer = timing.EvalTiming(perf_log_file) |
| 284 | + |
278 | 285 | trace_assigned_locals = trace_results = None |
279 | 286 | if trace_rows is not None: |
280 | 287 | # convert to numpy array so we can slice ndarrays as well as series |
@@ -311,24 +318,25 @@ def to_series(x): |
311 | 318 | n_randoms += 1 |
312 | 319 | assignment_expressions.loc[expression_idx, "expression"] = expression |
313 | 320 | if n_randoms: |
314 | | - try: |
315 | | - random_draws = state.get_rn_generator().normal_for_df( |
316 | | - df, broadcast=True, size=n_randoms |
317 | | - ) |
318 | | - except RuntimeError: |
319 | | - pass |
320 | | - else: |
321 | | - _locals_dict["random_draws"] = random_draws |
| 321 | + with performance_timer.time_expression("<RANDOM DRAWS>"): |
| 322 | + try: |
| 323 | + random_draws = state.get_rn_generator().normal_for_df( |
| 324 | + df, broadcast=True, size=n_randoms |
| 325 | + ) |
| 326 | + except RuntimeError: |
| 327 | + pass |
| 328 | + else: |
| 329 | + _locals_dict["random_draws"] = random_draws |
322 | 330 |
|
323 | | - def rng_lognormal(random_draws, mu, sigma, broadcast=True, scale=False): |
324 | | - if scale: |
325 | | - x = 1 + ((sigma * sigma) / (mu * mu)) |
326 | | - mu = np.log(mu / (np.sqrt(x))) |
327 | | - sigma = np.sqrt(np.log(x)) |
328 | | - assert broadcast |
329 | | - return np.exp(random_draws * sigma + mu) |
| 331 | + def rng_lognormal(random_draws, mu, sigma, broadcast=True, scale=False): |
| 332 | + if scale: |
| 333 | + x = 1 + ((sigma * sigma) / (mu * mu)) |
| 334 | + mu = np.log(mu / (np.sqrt(x))) |
| 335 | + sigma = np.sqrt(np.log(x)) |
| 336 | + assert broadcast |
| 337 | + return np.exp(random_draws * sigma + mu) |
330 | 338 |
|
331 | | - _locals_dict["rng_lognormal"] = rng_lognormal |
| 339 | + _locals_dict["rng_lognormal"] = rng_lognormal |
332 | 340 |
|
333 | 341 | sharrow_enabled = state.settings.sharrow |
334 | 342 |
|
@@ -356,7 +364,8 @@ def rng_lognormal(random_draws, mu, sigma, broadcast=True, scale=False): |
356 | 364 |
|
357 | 365 | if is_temp_singular(target) or is_throwaway(target): |
358 | 366 | try: |
359 | | - x = eval(expression, globals(), _locals_dict) |
| 367 | + with performance_timer.time_expression(expression): |
| 368 | + x = eval(expression, globals(), _locals_dict) |
360 | 369 | except Exception as err: |
361 | 370 | logger.error( |
362 | 371 | "assign_variables error: %s: %s", type(err).__name__, str(err) |
@@ -384,7 +393,8 @@ def rng_lognormal(random_draws, mu, sigma, broadcast=True, scale=False): |
384 | 393 |
|
385 | 394 | # FIXME should whitelist globals for security? |
386 | 395 | globals_dict = {} |
387 | | - expr_values = to_series(eval(expression, globals_dict, _locals_dict)) |
| 396 | + with performance_timer.time_expression(expression): |
| 397 | + expr_values = to_series(eval(expression, globals_dict, _locals_dict)) |
388 | 398 |
|
389 | 399 | if sharrow_enabled: |
390 | 400 | if isinstance(expr_values.dtype, pd.api.types.CategoricalDtype): |
@@ -459,4 +469,5 @@ def rng_lognormal(random_draws, mu, sigma, broadcast=True, scale=False): |
459 | 469 | inplace=True, |
460 | 470 | ) |
461 | 471 |
|
| 472 | + performance_timer.write_log(state) |
462 | 473 | return variables, trace_results, trace_assigned_locals |
0 commit comments